Javascript 基本概念(语法)

作者: Sue1024 | 来源:发表于2018-01-28 21:34 被阅读39次

语法

区分大小写

ECMAScript中的一切都区分大小写。

标识符

标识符指变量、函数、属性、参数的名字,有如下规则:

  • 第一个字符必须是字母、下划线或$
  • 其他字符可以是字母、下划线、$ 或数字
  • 不能把关键字、保留字、truefalsenull用作标识符
    标识符中的字符可以是扩展的ASCII或Unicode字符,但不推荐
    按照惯例,标识符采用驼峰大小写格式

注释

两个斜杠//开头表示行级注释
/*开头,以*/结尾的表示块级注释

严格模式

在脚本顶部或函数内第一行添加如下代码开启严格模式:

"use strict;"

语句

ECMAScript语句以分号结尾,可以省略,但不推荐,添加分号不仅可以降低压缩代码时出错的概率,也可以提升性能(解析器不用花时间判断哪里需要分号)

关键字和保留字

保留字在ECMAScript中没有任何特定用途,但将来可能被用作关键字。
以下是ECMAScript全部的关键字,标注星号的是ECMAScript 5提出来的:



以下是全部保留字:


变量

ECMAScript中的变量是松散型的,可以保存任何类型的数据。
var name;在当前作用域中定义了一个名为name的局部变量,也可以在定义时顺便赋值var name = 'Sue';,但这样并不会给name标注成字符串类型的变量。
如果我们给一个未定义的变量赋值,非严格模式下,我们会创建一个全局变量,严格模式下,会抛出ReferenceError
可以使用一条语句定义多个变量:

var name = 'Sue',
    age = '24';

数据类型

ECMAScript中有5中基本数据类型:Number Boolean String Null Undefined,一种复杂数据类型:Object,所有值都是这6种类型之一。

typeof

由于ECMAScript变量是松散的,因此需要一种手段来告诉我们变量存储的值的类型,于是就有了typeof,typeof操作符可以返回如下结果:

  • "undefined" :值未定义
  • "boolean":布尔值
  • "string":字符串
  • "object":对象或null
  • "number":数值
  • "function":函数
    typeof操作符的操作数可以是变量也可以是数值字面量。

有几个地方可能会让人迷惑:

  • typeof null时返回"object",这是因为null被认为是空对象的引用
  • Safari5及之前版本、Chrome7及之前版本,typeof /^d$/返回"function",其他浏览器返回"object"
  • function属于object却被区别对待,这是因为function比较特殊,有必要去识别它

Undefined类型

Undefined类型只有一个值undefined,声明时未被赋值的变量会为其赋予undefined,最初设计这个类型是为了区分空指针和未初始化变量,因此不存在需要为一个变量显式地赋予undefined值的情况。
对未初始化和未声明的变量调用typeof都会返回undefined,这是由于这两种都不可能执行真正的操作,但为了使typeof能够反应一个变量是否被声明,我们最好在定义一个变量时为它赋值。

Null类型

Null类型只有一个值null,它是一个空指针对象,undefined派生自null,因此:

undefined == null; //true

前面提到过,不存在需要为一个变量显式地赋值undefined的情况,但我们如果声明了一个将来要保存对象类型的变量,我们最好在这个变量被定义时给它赋予null

Boolean类型

Boolean类型只有两个值true false,可以对任何数据类型调用Boolean(),返回结果是true or false

数据类型 转化为true的值 转化为false的值
Boolean true false
String 任何非空字符串 空字符串""
Number 任何非0数值 0和NaN
Object 任何非空对象 空对象null
Undefined N/A undefined

Number类型

Number类型使用IEEE754表示整数和浮点数

整数
  • 十进制整数
    var num = 55;
  • 八进制整数,第一位必须是0,然后是0~7,如果超出范围,前导0会被忽略,后面的数值当做十进制整数解析。严格模式下八进制无效,会抛出错误。
var num1 = 070; // 7*8 + 0 = 56
var num2 = 079: // 79
  • 十六进制整数,前两位是0x,后面跟0 ~ 9和A~F(or a~f),如果超出范围,会抛出错误。
var num = 0x15a; //1*16*16 + 5*16 + 10 = 346

在进行算术计算时,八进制和十六进制都会转化为十进制:

var num1 = 10;
var num2 = 071;
var num3 = 0x56A;
num1 + num2; //67
num2 + num2; //114
num2 + num3; // 1553
num3 + num3; //2772
浮点数

浮点数值即数值中包含小数点,且小数点后必须有至少以为数字,注意小数点前可以没有数字,但不推荐。
由于保存浮点数需要的空间是整数的两倍,因此如果可以,ECMAScript会将浮点数保存为整数,比如:

var num1 = 1.0; // 1
var num2 = 1.; // 1

对于极大或极小的数值,可以用科学技术法表示(e或E):

var num = 2.34e6; //2.34 * Math.pow(10, 6)

在进行算术运算时,浮点数的精度远远不如整数,会有舍入误差,比如:

0.1 + 0.2 // 0.30000000000000004

所以永远不要测定某个浮点数值

数值范围

由于内存的限制,ECMAScript 并不能保存世界上所有的数值。ECMAScript 能够表示的最小数值保存在Number.MIN_VALUE 中——在大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE 中——在大多数浏览器中,这个值1.7976931348623157e+308。如果某次计算的结果得到了一个超出JavaScript 数值范围的值,那么这个数值将被自动转换成特殊的Infinity 值。具体来说,如果这个数值是负数,则会被转换成-Infinity(负无穷),如果这个数值是正数,则会被转换成Infinity(正无穷)。

以上引用了原文中的一段话,笔者亲自试验发现不是这样,在chrome 63.0.3239.132和Microsoft Edge中打开调试工具,做了如下运算:

Number.MAX_VALUE + 1; // 1.7976931348623157e+308
Number.MAX_VALUE + Math.pow(10, 291); // 1.7976931348623157e+308
Number.MAX_VALUE + Math.pow(10, 292); // Infinity

关于Number.MIN_VALUE说的也不是很准确,准确来说,这个变量保存了最小的大于零的数值

NaN

NaN, Not a Number,用于表示非数值。

  • 0 / 0 = NaN
  • 任何涉及NaN的运算都会返回NaN
  • NaN与任何数值包括NaN都不相等

可以通过isNaN()来判断任何数据类型是否是非数值,isNaN()在接收到一个参数后,如果它是基本数据类型,会尝试将其转化为数值,如果它是object,会先调用它的valueof(),再确定返回值是否能转化成数值,如果不能,则基于返回值调用toString(),然后再尝试转化成数值。

isNaN(NaN); // true
isNaN(10); // false
isNaN("10"); // false
isNaN("blue"); // true
isNaN(true); // false
isNaN([1, 2]); // true, [1, 2].valueof()返回[1, 2], [1, 2].toString() 返回 "1, 2"
isNaN([1]): // false, [1].valueof()返回[1], [1].toString() 返回 "1"

数值转换

Number()
数据类型
Boolean true为1, false为0
Number 输入即输出
Null 0
Undefined 0

可以用于任何数据类型, 规则如下:

数据类型
Boolean true为1, false为0
Number 输入即输出
Null 0
Undefined 0

String类型比较负责,规则如下:

  1. 如果只包含数字,包括前面带正负号的情况,将其转化为数字(前导0被忽略)
  2. 如果包含有效的十六进制格式,将其转化为十进制
  3. 如果包含有效的浮点格式,将其转化为浮点数值
  4. 空字符串转化为0
  5. 如果以上情况均不满足,转化为NaN
    举一些例子:
Number(true); // 1
Number(false); //0
Number(null); // 0
Number(undefined); //0
Number(3); // 3
Number(""); //0
Number("05"); // 5 不会把它当做八进制
Number("5.21"); //5.21
Number("0x43A"); // 1082
Number("num"); // NaN
parseInt()

parseInt()接收字符串参数,有如下规则:

  • 会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个非空格字符不是数字或正负号,那么返回NaN
  • 如果第一个非空格字符是数字,那么继续解析下一个字符,直至遇到不是数字的字符或者解析完后续所有字符,注意小数点并不是有效的数字字符
  • 可以识别十进制,八进制,十六进制,ECMAScript 5中,需要为其传入第二个参数指明进制,才可以识别八进制。在指明进制的情况下八进制可以不带前导0,十六进制可以不带0x。
    举一些例子:
parseInt(""); //NaN
parseInt(".23); //NaN
parseInt("23.4"); //23
parseInt("23abc"); //23
parseInt("+23"); //23
parseInt("-23"); //-23
parseInt("070"); //70, ECMAScript
parseInt("0x7A"); //122
parseInt("070", 8); //56
parseInt("7A", 16); //122
parseFloat()

parseFloat() 与 parseInt() 很类似,有两点区别:

  1. parseFloat() 字符串第一个小数点是有效的,第二个是无效的,后面的也不会解析
  2. parseFloat() 不能识别八进制和十六进制,符合八进制的字符串会忽略前导0,符合十六进制的字符串会被解析为0
  3. parseFloat() 可以识别科学计数法

举一些例子:

parseFloat("23.24.5"); //23.24
parseFloat("3.4e5"); //340000
parseFloat("0x8A"); //0
parseFloat("045"); //45

String类型

有0或多个16位Unicode字符字符组成的字符序列,即字符串,可由单引号或双引号表示。

转义序列

表示非打印或有其他用途的字符

转义序列 含义
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\ 斜杠
' 用于在单引号表示的字符串中显示单引号
" 用于在双引号表示的字符串中显示双引号
\xnn 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A"
\unnnn 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ

转义序列可以出现在字符串的任何地方,作为一个字符来解析,可以通过length属性获得字符串的长度

字符串的特点

var lang = "Java";
lang = lang + "Script";
以上示例中的变量lang 开始时包含字符串"Java"。而第二行代码把lang 的值重新定义为"Java"与"Script"的组合,即"JavaScript"。实现这个操作的过程如下:首先创建一个能容纳10 个字符的新字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和字符串"Script",因为这两个字符串已经没用了。

转化为字符串
  1. toString() Number、Boolean、Object、String都有toString()方法,Number的toString()可以接收 进制参数,以相应的进制格式输出。
  2. 由于nullundefined没有toString()方法,因此对null or undefined调用toString()会报错,我们可以使用转型函数String(),它遵循以下规则:
  • 如果带toString(),则调用toString()
  • 如果是null, 则返回"null"
  • 如果是undefined,则返回"undefined"

Object类型

对象就是一组数据和功能的集合,可以通过new后跟要创建的对象类型来创建,比如:

var array = new Array(10);

如果没有参数,可省略括号。
Object是所有它的实例的基础,每个实例都有如下属性和方法:

  • constructor,是用于创建对象的函数,对于上述例子,是Array

函数

  • hasOwnProperty(propertyName) 给定的属性在当前实例而非原型中是否存在,作为参数的属性名必须是字符串
  • isPrototypeOf(object) 检查object是否是实例对象的原型
  • propertyIsEnumerable(propertyName) 给定的属性是否可以使用for-in来枚举,作为参数的属性名必须是字符串
  • toLocaleString() 返回对象与执行环境相对应的字符串表示
  • toString() 返回对象的字符串表示
  • valueOf() 返回对象的字符串、布尔值、数值表示
    ECMAScript中对象的行为不适用于DOM、BOM中的对象。

相关文章

  • 小红书阅读笔记~第三章

    JavaScript基本概念有什么:语法、数据类型、流程控制语句、理解函数。 JavaScript语法 ECMAS...

  • 《JavaScript 高级程序设计》学习笔记

    javascript 高级程序设计 在HTML中使用javascript 基本概念 1、 语法1.1 区分大小写1...

  • Javascript 基本概念(语法)

    语法 区分大小写 ECMAScript中的一切都区分大小写。 标识符 标识符指变量、函数、属性、参数的名字,有如下...

  • JavaScript 学习之路-语法篇(上)

    上篇文章介绍了 JavaScript 的基本概念和发展概况,这篇文章将开始讲 JavaScript 的一些基本语法...

  • JavaScript基本概念之语法

    语法 区分大小写 ECMAScript中的一切(变量、函数名和操作符)都区分大小写。这意味着,变量名test和变量...

  • JSON 语法

    JSON 语法是 JavaScript 语法的子集。 JSON 语法规则 JSON 语法是 JavaScript ...

  • JavaScript语法

    JavaScript语法 一、JavaScript的组成 完整的JavaScript是由ECMAScript(语法...

  • 2018-11-05

    01javascript语法规范 javascript语法...

  • js_api

    JavaScript substring() 方法 语法 JavaScript slice() 方法 语法 Jav...

  • 小程序wxs的使用(一)

    基本概念 注:wxs虽然与JavaScript是不同的语言,但我们在写wxs的时候,可以按照es5的语法去写,当你...

网友评论

    本文标题:Javascript 基本概念(语法)

    本文链接:https://www.haomeiwen.com/subject/vewoaxtx.html