对象属性的访问方式:通过 .identifier
或是 [expression]
的方式进行访问获取。
对比优缺点:
- 点的方式访问属性代码较少,简单直接,且要求访问的属性名称为合法的标识符且需要知道要访问的属性的名称
- 中括号的方式可以访问属性名称为保留字、空格、字符、或是数字的形式
任意表达式的调用都是表达式和一对圆括号进行调用,如果表达式是属性访问的表达式,则为方法调用,方法的函数体执行过程中其内部的 this
指向为作为属性访问主题的对象和数组。
对象创建表达式创建对象的过程:创建一个空对象,然后,JavaScript
传入指定的参数并将这个新对象当作this
的值来调用一个指定的函数,这个函数可以使用 this 来初始化这个新创建的对象的属性。构造函数不会返回值,这个新创建并被初始化后的对象就是整个对象创建表达式的值。如果构造函数确实返回了一个对象值,那么这个返回的对象值就作为整个构造函数(对象创建表达式)的值。
运算符之自增和自减:运算符在前为前增,先自增后计算;运算符在后为后增,先计算在自增。
运算符之加号运算符:加号运算符优先考虑字符串的拼接,之后才进行算术加法。
算术运算符的行为表现为:
- 如果其中一个是对象类型,则进行对象转换字符串
- 进行转换之后获取的原始值如果有一个是字符串则另一个也会转为字符串
- 否则转为数字进行算术加法
运算符之位运算符:& | ^(异或) ~ << >> >>>(无符号右移),位运算符要求值为32位整型,必要时会进行类型转换为数字并将操作数转为32位整型,可能会丢失小数或超出32位的值。移位运算符要求右操作数为0-31位之间,然后转换为无符号的32位整数,它们将舍弃第5位之后的二进制位,以便生成一个位数正确的数字。需要注意的是 NaN、Infinity、-Infinity都会被转换为 0
相等的类型转换计算:
- 如果相同则直接进行比较
- 如果一个值是
null
另一个是undefined
,返回true
- 如果一个值是数字,另一个是字符串,则把字符串转为数字然后对转换之后的值进行对比
- 如果一个是布尔值,则转换为
0/1
进行比较 - 如果一个值是对象,另一个值是数字或是字符串,则将对象进行
valueOf
再进行toString
转换为原始值然后进行比较。日期类仅进行toString
转换 - 否则其他的都不相等
比较运算符的类型转换:
- 如果两个一个是字符串一个是数字,则转为数字后进行对比
- 如果都是字符串,则直接进行字符串的
Unicode
进行对比 - 如果有一个是对象,则先
valueOf()
转换,如果返回的是原始值,则直接使用,否则进行toString()
转换之后再比较
instanceOf
期望接收左边操作数右侧类,其计算方式为:计算右侧的prototype
原型,然后在左侧的原型链上去查找该它,如果找到则为true
否则返回false
原始数据类型声明没有原型指向,即无法判断原始数据类型。
可以判断引用数据类型,但是无论数据、函数、对象全部指向Object,所以instanceOf Object
返回true
typeof
一元运算符,放在操作数前,操作时为任意类型。
value | typeof |
---|---|
undefined | undefined |
null | object |
true/false | boolean |
any number or NaN | number |
any string | string |
any function | function |
any array | object |
any object | object |