x 未定义
++i 的效果等价于 i = i + 1,所以 n[i] = ++i 这样会直接影响到 for 循环里 i 的值,for 循环实际只循环了 5 次,i 的值依次为 0, 2, 4, 6, 8:
// 第1次。上一次 i 的值为 0,i 在循环初始 (0++) 为 0 n[0] = (i = 0 + 1); // 此时 i 变成了 1; n 为 [1] // 第2次。上一次 i 的值为 1,i 在循环初始 (1++) 为 2 n[2] = (i = 2 + 1); // 跳过了 n[1] // 此时 i 变成了 3; n 为 [1, empty, 3] // 第3次。上一次 i 的值为 3,i 在循环初始 (3++) 为 4 n[4] = (i = 4 + 1); // 跳过了 n[3] // 此时 i 变成了 5; n 为 [1, empty, 3, empty, 5] // 第4次。上一次 i 的值为 5,i 在循环初始 (5++) 为 6 n[6] = (i = 6 + 1); // 跳过了 n[5] // 此时 i 变成了 7; n 为 [1, empty, 3, empty, 5, empty, 7] // 第5次。上一次 i 的值为 7,i 在循环初始 (7++) 为 8 n[8] = (i = 8 + 1); // 跳过了 n[7] // 此时 i 变成了 9; n 为 [1, empty, 3, empty, 5, empty, 7, empty, 9] // 第6次。上一次 i 的值为 9,i 在循环初始 (9++) 为 10,不满足 i < 10 的条件,for 循环结束。
同学你的
单词写错了你第一行,function后面那一个函数名Foo1多了个1,改为Foo就好啦
相当于加了括号运算符
如图示
&& || != == === 这些符号的意义不一样好么!去查一下
能不能delete成功就是看属性的configurable的值是ture还是false。如果是ture就是能够删除属性,否则删除失败
因为解析的原因。如果直接以{}开头会直接被误认为是一个块语句而不是一个空对象。那么instanceof的左操作数就不对了。所以才有语法错误。类似的如果直接用function(){}也是不行的因为会被解析成函数声明。不过就算不先定义给他们加个括号也可以解决了。因为括号里先计算了语法上就解释通了。
Object.defindProperty是修改默认属性的方法,接受三个参数,第一个是属性所在的对象obj,第二个是属性的名字x,第三个是描述符configurable 为false 是表示属性x不可以被删除和修改。
你是想问1+{foo:'bar'}吧。
如下图:
其key在这儿指的就是x,且该key的value为1.
你可以打个比喻 : foo为父类,obj为子类,子类可以继承父类的属性
表达式,this可是JS解释器生成一个值
在此页 按F12,在console输入“+!{}”、“+”、“+!”结果都是0;“+!{}[true]”、“+!{}[1]”、“+[1]”、“+!{}[false]”结果都是1."!{}"是false,“!{}[true]”是true,“+!{}[true]”相当于“+true”结果是1
大概是VIM吧
在看看,应该没有问题。
第一个字母大小写不一样
一个完整的语句,如果以{开头,就会被理解为block(块)
也就是说:
{} + []
直接这样写,等于被拆分为:
{} // 这是空块被忽略
+[] // 这是最后返回的值
因此直接在控制台输入返回的是+[](空数组转数字)也就是0.
而如果换种写法:var n = {} + []; // 此时 {} 不再是块,而是空对象字面量。
这时会尝试转字符串,即[object Object],而空数组转换为字符串就是空串,所以最终返回[object Object].
,操作符就是从左到右依次计算表达式,最后返回最右边的操作数。
所以这里(1, 2, 3)返回3.
单纯按照例子中这样写没特别意义,写var val = 3;即可。
x应该在Foo.prototype上,
所以Foo.prototype.hasOwnProperty('x')才返回false
而Foo是函数对象,Foo.__proto__其实是Function.prototype,这两个对象上当然木有x属性咯~~~
再仔细看看原型链,看不懂也没关系,OOP章节我还会再次提到原型链,并且会更加展开的讲解。
有问题再开新帖回复哟~~~慕课网被回复似乎看不到。。。(摔~)
少了一个下划线哦,proto两边都是两个下划线。