有几个小问题:
为什么有的编程规范要求用 void 0 代替 undefined?
字符串有最大长度吗?0.1 + 0.2 不是等于 0.3 么?
ES6 新加入的 Symbol 是个什么东西?
为什么给对象添加的方法能用在基本类型上?
* 运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法
-
类型
Undefined; Null; Boolean; String; Number; Symbol; Object。a. undefined
undefined 是变量而不是关键字 所以他可以被赋值 所以 当我们要代表 undefined的时候 可以使用 void void 只是单纯的表示 对象返回值为 undefinedb. Boolean
c. String
String 有最大长度是 2^53 - 1 ( 不是字符串长度是 编码长度 )
字符串是永远无法变更的 // var str1 = ‘a’; str1[0] = 1; str1 // ‘a’d. Number
Number 类型有 18437736874454810627(即 264-253+3) 个值
NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字;
Infinity,无穷大;
-Infinity,负无穷大。除法场合需要特别留意 +0 或 -0 检测是 +0 或者 -0 1/x == Infinity 或 -Infinity Number 类型中有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff 0.1 + 0.2 == 0.3 // false Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON // truee. Symbol
利用 Symbol.iterator 属性来自定义 for … of 在对象上的行为var o = new Object o[Symbol.iterator] = function() { var v = 0 return { next: function() { return { value: v++, done: v > 10 } } } }; for(var v of o) console.log(v); // 0 1 2 3 ... 9f. Object
3 是一个Number类型
new Number(3) 是一个对象类型
Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换
Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器* 代码可以把对象的方法在基本类型上使用 console.log("abc".charAt(0)); //a 在原型上添加方法,都可以应用于基本类型 Symbol.prototype.hello = () => console.log("hello"); var a = Symbol("a"); console.log(typeof a); //symbol,a并非对象 a.hello(); //hello,有效 -
类型转换
看图: 类型转换.jpga. StringToNumber
Number 是比 parseInt 和 parseFloat 更好的选择b. NumberToString
当 Number 绝对值较大或者较小时,字符串表示则是使用科学计数法表示的
其实就是保证了产生的字符串不会过长 -
装箱转换 ( 把基本类型转换为对应的对象 )
每一种基本类型 Number、String、Boolean、Symbol 在对象中都有对应的类Symbol函数无法使用new来调用
var symbolObject = (function(){ return this; }).call(Symbol("a")); console.log(typeof symbolObject); //object console.log(symbolObject instanceof Symbol); //true console.log(symbolObject.constructor == Symbol); //true -
拆箱转换
ToPrimitive函数 是对象类型到基本类型的转换
把对象变成基本类型 再从基本类型转换为对应的String 和 Number拆箱转换会尝试调用 valueOf 和 toString 来获得拆箱后的基本类型 如果valueOf 和 toString都不存在 或者没有返回基本类型 则会产生TypeError
var o = { valueOf : () => {console.log("valueOf"); return {}}, toString : () => {console.log("toString"); return {}} } o * 2 // valueOf // toString // TypeError string(o) // toString // valueOf // typeError
List 和 Record: 用于描述函数传参过程。
Set:主要用于解释字符集等。
Completion Record:用于描述异常、跳出等语句执行过程。
Reference:用于描述对象属性访问、delete 等。
Property Descriptor:用于描述对象的属性。
Lexical Environment 和 Environment Record:用于描述变量和作用域。
Data Block:用于描述二进制数据。
typeof运算结果 看图

被折叠的 条评论
为什么被折叠?



