七个类型:
- undefined
- null
- Boolean
- String
- Number
- Symbol
- Object
ECMAScript: 由ecma国际定义的js标准,1999年12月,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。2015年6月17日,ECMAScript 6发布正式版本,即ECMAScript 2015
es3.0 中undefined可以重新赋值,但是在es5中已经屏蔽了这个操作
- undefined和null的区别:
1.前者可以被重新赋值,但是es5已经作了屏蔽,后者是关键字,不可以重新赋值
!function(window, undefined) {
// 这里的undefined就不会出现赋值的问题
}(window)
-
undefined in window// true;
null in window// false -
unicode规定一个字符用两个字节表示,一个字节是8位,那么就是 2 ^ 8 * 2 ^ 8 = 65536
ascii包含128个字符
utf-8 和utf-16的区别:utf-8 使用1、2、3、4个字节来表示,utf16用2或4个字节来表示 -
对比number小数位
Math.abs(0.1 + 0. 2 0.3) < Number.EPSILON -
symbol 的定义和使用
- 原始数据类型: 独一无二的值
let s1 = Symbol('s1')
- 不能做运算:
Boolean(s) // true
String(s) // Symbol('s1')
Number(s) // 报错,不能转数字,所以不能用于任何的 + - * /
s.toString()// 'Symbol('s1')' - !!Symbol() // true
- 不能new操作符, 是
- Object.assign(obj, newSymbolKeyObj) // 能够被复制到新对象上
使用场景
-
可以作为obj的key值,obj的key值只能是string和symbol
- 可以作为对象的私有属性: 因为JSON.stringify(obj),Object.keys()、for in、for of不会返回Symbol的key值
- 获取obj中的symbol()属性:Reflect.ownKeys(obj)、Object.getOwnPropertySymbols(obj)
- Symbol.for('foo') 和 Symbol.keyFor(s)
let s = Symbol.for('foo') // 返回Symbol(foo)
let s = Symbol.keyFor(s) // 返回'foo'
* 可以定义常量:
* let RESOVLED = Symbol() -
内置的Symbol相关方法
> Array.prototype[Symbol.iterator] = function() { // 重新定义for of let v = 0; return { next: function () { return {value: v++, done: v > 10} } } } > class objSelf { // 定义了instanceof行为,只有在右边是objSelf的时候才会调用 static [Symbol.hasInstance] (obj) { console.log('Symbol.hasInstance') return true } } [] instanceof objSelf
- 原始数据类型: 独一无二的值
## 数值运算,类型转换
```javascript
let obj = { // 进行数值运算,对象转原始类型,最高优先级toPrimitive,其次是valueof,其次是tostring
[Symbol.toPrimitive](hint) {
if(hint === 'number'){ // 要转成数字
console.log('Number场景');
return 123;
}
if(hint === 'string'){ // 要转成字符串
console.log('String场景');
return 'str';
}
if(hint === 'default'){ // 可以转成字符串或者数字
console.log('Default 场景');
return 'default';
}
},
valueof () {
console.log('valueof')
return false
},
toString() {
console.log('toString')
return false
}
}
console.log(obj **2) // number
console.log(String(2)) // string
console.log(obj + 2) // default
数据类型转换规则
转成boolean、string、number
image.png
-
- 转成boolean
undefined、null、0、’‘、NaN、false、0、-0都转为false,其他都是true
-
- 四则运算
除了加法,只要有number就都转为number
6 * [2,1] // NaN
true * [2] // 2 -
- 加法运算符
1. 一方有string都转为string 2. boolean和number,转成number 3. 非number调用toSting()
-
- 比较运算符
对象:通过primitive、valueof、toString转换
strring: 通过unicode编码大小比较 -
== 和 ===
例子:[] == ![] // true
[] == !{} // true
{} == !{} // false
{} == ![] // false
image.png
-
- a==1 && a==2 && a==3
相关知识点:
- a==1 && a==2 && a==3
- 隐式转换查找顺序是Symbol.isPrimitive、valueof、toString,如果是转换成字符串的隐式类型转换顺序是Symbol.isPrimitiv、toString、valueof
let a = {
i: 1,
Symbol.isPrimitive {
return this.i++
},
valueof () {
return this.i++
},
toString () {
return this.i++
},
} - 利用setter和getter
网友评论