-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
类数组对象的表现 #2
Comments
输出结果在 chrome 中表现为 [empty × 2, 1, 2, splice: ƒ, push: ƒ] 在其他浏览器表现为 {2: 1, 3: 2, length: 4, push: f, splice: f} 乍一看好像不一样,其实结果是一样的,展开 chrome 上的 obj 的输出就发现其原型还是 Object。chrome 上的输出是由于 ChromeDevTools 特殊处理导致显示不一样。 分析chrome 的特殊显示从 ChromeDevTools 中可以看到,当对象含有 举一些例子: {1:'a',length:2,splice:()=>{}} // Object(2) [empty, "a", splice: ƒ]
{1:'a',length:2,splice:'a'} // {1: "a", length: 2, splice: "a"}
{1:'a',length:1.5,splice:()=>{}} // {1: "a", length: 1.5, splice: ƒ} push接下来分析 push,当调用
由于一开始 同理第二次 最后,举个在 var obj = {
'splice': Array.prototype.splice,
'push': Array.prototype.push
}
obj // {splice: ƒ, push: ƒ}
obj.push("a")
obj // Object ["a", splice: ƒ, push: ƒ] |
ChromeDevTools 源码中有这样一段代码 typeof len === 'number' && (len >>> 0 === len && (len > 0 || 1 / len > 0)) 其作用是判断一个变量为数字,并且该数字为32位非负整数 >>> (无符号右移)
(2**32-1) >>> 0 === 4294967295 // (0)11111111111111111111111111111111 -> (0)11111111111111111111111111111111
(2**32) >>> 0 === 0 // 100000000000000000000000000000000(33位) -> (0)00000000000000000000000000000000(32位无符号)
-1 >>> 0 === 4294967295 // 11111111111111111111111111111111 -> (0)11111111111111111111111111111111
1.1 >>> 0 === 1 // 小数部分直接丢弃 那看来 其实是为了判断值为 -0 的情况,(当然 0、+0 这里是可以的) -0 >>> 0 === -0 // true
(-0 > 0 || 1 / -0 > 0) // false, 1 / -0 === -Infinity 所以会有这样的差异 {1:'a',length:-0,splice:()=>{}} // {1: "a", length: -0, splice: ƒ}
{1:'a',length:0,splice:()=>{}} // Object [1: "a", splice: ƒ] 那为什么要特殊判断一个 -0 呢 。。 不知道,如果你知道的话 欢迎评论。。 |
暂时没有明白特殊判断 -0 含义,只能认为是 ChromeDevTools 的需求吧 |
题目来源 #76
问题:
请问输出结果是什么,为什么
The text was updated successfully, but these errors were encountered: