七個類型:
- undefined
- null
- Boolean
- String
- Number
- Symbol
- Object
ECMAScript: 由ecma國際定義的js標(biāo)準(zhǔn),1999年12月,ECMAScript 3.0版發(fā)布,成為JavaScript的通行標(biāo)準(zhǔn),得到了廣泛支持。2015年6月17日,ECMAScript 6發(fā)布正式版本,即ECMAScript 2015
es3.0 中undefined可以重新賦值,但是在es5中已經(jīng)屏蔽了這個操作
- undefined和null的區(qū)別:
1.前者可以被重新賦值,但是es5已經(jīng)作了屏蔽,后者是關(guān)鍵字,不可以重新賦值
!function(window, undefined) {
// 這里的undefined就不會出現(xiàn)賦值的問題
}(window)
undefined in window// true;
null in window// falseunicode規(guī)定一個字符用兩個字節(jié)表示,一個字節(jié)是8位,那么就是 2 ^ 8 * 2 ^ 8 = 65536
ascii包含128個字符
utf-8 和utf-16的區(qū)別:utf-8 使用1、2、3、4個字節(jié)來表示,utf16用2或4個字節(jié)來表示對比number小數(shù)位
Math.abs(0.1 + 0. 2 0.3) < Number.EPSILON-
symbol 的定義和使用
- 原始數(shù)據(jù)類型: 獨(dú)一無二的值
let s1 = Symbol('s1')
- 不能做運(yùn)算:
Boolean(s) // true
String(s) // Symbol('s1')
Number(s) // 報(bào)錯,不能轉(zhuǎn)數(shù)字,所以不能用于任何的 + - * /
s.toString()// 'Symbol('s1')' - !!Symbol() // true
- 不能new操作符, 是
- Object.assign(obj, newSymbolKeyObj) // 能夠被復(fù)制到新對象上
使用場景
-
可以作為obj的key值,obj的key值只能是string和symbol
- 可以作為對象的私有屬性: 因?yàn)镴SON.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() 內(nèi)置的Symbol相關(guān)方法
> Array.prototype[Symbol.iterator] = function() { // 重新定義for of let v = 0; return { next: function () { return {value: v++, done: v > 10} } } } > class objSelf { // 定義了instanceof行為,只有在右邊是objSelf的時候才會調(diào)用 static [Symbol.hasInstance] (obj) { console.log('Symbol.hasInstance') return true } } [] instanceof objSelf - 原始數(shù)據(jù)類型: 獨(dú)一無二的值
## 數(shù)值運(yùn)算,類型轉(zhuǎn)換
```javascript
let obj = { // 進(jìn)行數(shù)值運(yùn)算,對象轉(zhuǎn)原始類型,最高優(yōu)先級toPrimitive,其次是valueof,其次是tostring
[Symbol.toPrimitive](hint) {
if(hint === 'number'){ // 要轉(zhuǎn)成數(shù)字
console.log('Number場景');
return 123;
}
if(hint === 'string'){ // 要轉(zhuǎn)成字符串
console.log('String場景');
return 'str';
}
if(hint === 'default'){ // 可以轉(zhuǎn)成字符串或者數(shù)字
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
數(shù)據(jù)類型轉(zhuǎn)換規(guī)則
轉(zhuǎn)成boolean、string、number

-
- 轉(zhuǎn)成boolean
undefined、null、0、’‘、NaN、false、0、-0都轉(zhuǎn)為false,其他都是true
-
- 四則運(yùn)算
除了加法,只要有number就都轉(zhuǎn)為number
6 * [2,1] // NaN
true * [2] // 2 -
- 加法運(yùn)算符
1. 一方有string都轉(zhuǎn)為string 2. boolean和number,轉(zhuǎn)成number 3. 非number調(diào)用toSting() -
- 比較運(yùn)算符
對象:通過primitive、valueof、toString轉(zhuǎn)換
strring: 通過unicode編碼大小比較 -
== 和 ===
例子:[] == ![] // true
[] == !{} // true
{} == !{} // false
{} == ![] // false
image.png
-
- a==1 && a==2 && a==3
相關(guān)知識點(diǎn):
- a==1 && a==2 && a==3
- 隱式轉(zhuǎn)換查找順序是Symbol.isPrimitive、valueof、toString,如果是轉(zhuǎn)換成字符串的隱式類型轉(zhuǎn)換順序是Symbol.isPrimitiv、toString、valueof
let a = {
i: 1,
Symbol.isPrimitive {
return this.i++
},
valueof () {
return this.i++
},
toString () {
return this.i++
},
} - 利用setter和getter
