Symbol("foo") + "bar" // TypeError 6.Symbol 工厂函数返回的 symbol,可作为对象的属性名,可以避免属性冲突,在 for...in 迭代中不可枚举 var...,当使用 JSON.stringify() 进行序列化时,该属性会被忽略 JSON.stringify({[Symbol("foo")]: "foo"}); // '{}' 8.Symbol 是唯一的...('some key'); mySymbol1 == mySymbol2 //true Symbol 实战 对象字面量私有属性和方法 const myPrivateMethod = Symbol("myPrivateMethod...'.search('ng') // 4 该示例的执行流程: 解析 'angular'.search('ng') 把 ‘angular’ 转换为字符串对象 new String('angular') 把...) 语句 把 ‘Angular7’ 转换为字符串对象 new String("Angular7") 由于 article 是对象,这里不需要进行转换 调用 ‘Angular7’ 字符串对象的 search
图1-2 存取描述符 1.1.1. 数据描述符 ? ? writable:当 writable 属性设置为 false 时,该属性被称为“不可写”。它不能被重新分配。 ?...禁止扩展(不能新增属性) 如果一个对象可以添加新的属性,则这个对象是可扩展的。...Object.preventExtensions()将对象标记为不再可扩展,因此它将永远不会具有超出它被标记为不可扩展的属性。注意,一般来说,不可扩展对象的属性可能仍然可被删除。 ? ?...会创建一个冻结对象,这个方法会在一个现有对象上调用 Object.seal(...) 并把所有“数据访问”属性标记为 writable:false,这样就无法修改它们值。...delete obj.quaxxor; // 返回true,因为quaxxor属性从来未被添加 obj.sparky = 'arf'; // throws a TypeError } fail
如果一个对象可以添加新的属性,则这个对象是可扩展的。Object.preventExtensions()将对象标记为不再可扩展,这样它将永远不会具有它被标记为不可扩展时持有的属性之外的属性。...注意,一般来说,不可扩展对象的属性可能仍然可被删除。尝试将新属性添加到不可扩展对象将静默失败或抛出TypeError(最常见的情况是strict mode (en-US)中,但不排除其他情况)。...这种行为只针对内部的 [[prototype]] 属性, 目标对象的其它属性将保持可变。 一旦将对象变为不可扩展的对象,就再也不能使其可扩展。...默认情况下,对象是可扩展的:即可以为他们添加新的属性。以及它们的 __proto__ 属性可以被更改。...当前属性的值只要原来是可写的就可以改变。 通常,一个对象是可扩展的(可以添加新的属性)。密封一个对象会让这个对象变的不能添加新属性,且所有已有属性会变的不可配置。
,防止将来对对象的扩展被添加到对象中,该方法与Object.preventExtensions()相似。...如果设置的原型不是Object或null,或者被修改的对象的原型不可扩展,则抛出TypeError。...中,它将被强制为不可扩展的普通对象并返回false。...preventExtensions() Object.preventExtensions()返回被设为不可扩展的对象,如果参数不是对象,则在ES5中抛出TypeError,在ES2015中,参数如为不可扩展的普通对象...如果对象已变得不可扩展,则Reflect.preventExtensions() 返回true,否则返回false。如果参数不是对象,则抛出TypeError。
,一个不可扩展的对象的 _proto_ 属性是不可变的 let obj = {}; Object.preventExtensions(obj); obj....如果存在分配错误,此函数将引发 TypeError,这将终止复制操作。如果目标属性不可写,则将引发 TypeError。...阻止对象扩展 Object.preventExtensions() 用来限制对象的扩展,设置之后,对象将无法添加新属性。 对象的属性不可用扩展,但是已存在的属性可以被删除。...无法添加新属性指的是无法在自身上添加属性,如果是在对象的原型上,还是可以添加属性的。 Object.isExtensible() 方法用来判断一个对象是否可扩展。...冻结对象 Object.freeze() 方法用来冻结一个对象,被冻结的对象将无法添加,修改,删除属性值,也无法修改属性的特性值,即这个对象无法被修改。
Uncaught TypeError: Cannot read property 如果你是一个javascript开发者,你肯定看到过此错误 读取属性或调用方法的对象的未定义 这可能由于许多原因而发生,...反过来,这意味着ItemList将项目定义为未定义,并且您在控制台中收到错误 - “Uncaught TypeError:无法读取未定义的属性’map’”。 这很容易解决。...8. TypeError: Cannot read property ‘length’ 您通常会在数组中找到定义的长度,但如果未初始化数组或者在另一个上下文中隐藏变量名,则可能会遇到此错误。...Uncaught TypeError: Cannot set property 当我们尝试访问未定义的变量时,它总是返回undefined,我们无法获取或设置undefined的任何属性。...在这种情况下,应用程序将抛出“Uncaught TypeError无法设置未定义的属性”。 10.
你还可以通过在函数体的开头的位置添加 'use strict' ,来为该函数单独启用严格模式: JavaScript 代码: function hello() { 'use strict' return...在 JavaScript 中,可以使用下面代码定义对象属性不可写 JavaScript 代码: const car = {}Object.defineProperty(car, 'color', { value...: Cannot set property color of # which has only a getter })() 非严格模式允许扩展一个不可扩展的对象: JavaScript 代码: const...string 'test'})() 删除错误 在非严格模式,如果你尝试删除无法删除的属性,JavaScript 只返回 false ,而在严格模式下,它会引发 TypeError: JavaScript...3)//2 3 (function(a, a, b) { 'use strict' console.log(a, b)})(1, 2, 3)//Uncaught SyntaxError: Duplicate
isExtensible(target) 与Object.isExtensible类似,判断一个对象是否可扩展(是否可以在它上面添加新的属性),它们的不同点是,当参数不是对象时(原始值),Object的将它强制转变为一个对象...preventExtensions(target) 与Object.preventExtensions类似,阻止新属性添加到对象,不同点和上一条一样。...注意,如果目标对象不可扩展(non-extensible),则defineProperty不能增加目标对象上不存在的属性,否则会报错。...另外,如果目标对象的某个属性不可写(writable)或不可配置(configurable),则defineProperty方法不得改变这两个设置。...,但它不是目标对象的透明代理,即不做任何拦截的情况下,也无法保证与目标对象的行为一致。
Object.assign() 方法只能拷贝源对象的可枚举的自身属性,同时拷贝时无法拷贝属性的特性们,而且访问器属性会被转换成数据属性,也无法拷贝源对象的原型,该方法配合 Object.create()...== y; } }; } Object.preventExtensions() 方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。...= "FAIL"; // throws a TypeError } fail(); // 一个不可扩展对象的原型是不可更改的,__proto__是个非标准魔法属性,可以更改一个对象的原型. var...__proto__ = { oh: "hai" }; // 抛出TypeError异常 Object.isExtensible() 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。...,阻止添加新属性并将所有现有属性标记为不可配置。
对象的类(class)是一个标识对象类型的字符串; 3. 对象的扩展标记(extensible flag)指明了是否可以向该对象添加新属性。 属性特性: 1....可扩展性 Object.isExtensible()判断对象是否可扩展,Object.preventExtensions()转换为不可扩展的。...一旦将对象转换为不可扩展的,将无法再将其转换回可扩展的了。...需要注意,Object.preventExtensions()只影响到对象本身的可扩展性,如果给一个不可扩展的对象的原型添加属性,这个不可扩展的对象同样会继承这些新属性;至此提供了一种从“可扩展”->“...Object.preventExtensions()[不可扩展] -> Object.seal()[不可扩展、自有属性不可配置] -> Object.freeze()[不可扩展、自有属性不可配置、数据属性设置为只读
TypeError: ’undefined’ is not an object 在Safari里读取未定义对象的属性或调用未定义对象的方法时就会发生这个错误,在Safari开发者控制台可以很容易地重现这个错误...TypeError: null is not an object 在Safari里读取空(null)对象的属性或调用空对象的方法时就会发生这个错误,在Safari开发者控制台可以很容易地重现这个错误。...TypeError: Object doesn’t support property 在IE里读取未定义对象的属性或调用未定义对象的方法时就会发生这个错误,在IE开发者控制台可以很容易地重现这个错误。...8....Uncaught TypeError: Cannot set property 我们无法对undefined变量进行赋值或读取操作,否则的话会抛出“Uncaught TypeError: cannot
通过传播复制普通对象和数组 我们可以扩展为对象字面量和扩展为数组字面量进行复制: 1const copyOfObject = {...originalObject}; 2const copyOfArray...== original.b.d); 注意,deepCopy() 仅解决了一个扩展问题:浅拷贝。而其他所有内容:不复制原型,仅部分复制特殊对象,忽略不可枚举的属性,忽略大多数属性。...背景:JavaScript 中的不变性 JavaScript 具有三个级别的保护对象: Preventing extensions 使得无法向对象添加新属性。但是,你仍然可以删除和更改属性。...方法: Object.preventExtensions(obj) Sealing 可以防止扩展,并使所有属性都无法配置(大约:您无法再更改属性的工作方式)。...方法: Object.seal(obj) Freezing 使对象的所有属性不可写后将其密封。也就是说,对象是不可扩展的,所有属性都是只读的,无法更改它。
如果原对象不可配置或者禁止扩展,这时has拦截会报错。...也就是说,如果某个属性不可配置(或者目标对象不可扩展),则has方法就不得“隐藏”(即返回false)目标对象的该属性。...注意,如果目标对象不可扩展(non-extensible),则defineProperty不能增加目标对象上不存在的属性,否则会报错。...另外,如果目标对象不可扩展(non-extensible), getPrototypeOf方法必须返回目标对象的原型对象。...另外,如果目标对象是不可扩展的(non-extensible),这时ownKeys方法返回的数组之中,必须包含原对象的所有属性,且不能包含多余的属性,否则报错。
如果原对象不可配置或者禁止扩展,这时has()拦截会报错。...也就是说,如果某个属性不可配置(或者目标对象不可扩展),则has()方法就不得“隐藏”(即返回false)目标对象的该属性。...注意,如果目标对象不可扩展(non-extensible),则defineProperty()不能增加目标对象上不存在的属性,否则会报错。...另外,如果目标对象不可扩展(non-extensible), getPrototypeOf()方法必须返回目标对象的原型对象。...另外,如果目标对象是不可扩展的(non-extensible),这时ownKeys()方法返回的数组之中,必须包含原对象的所有属性,且不能包含多余的属性,否则报错。
(obj1, "x", { value: 42, writable: false }); obj1.x = 9; // 抛出TypeError错误 // 给只读属性赋值 var obj2 = { get...x() { return 17; } }; obj2.x = 5; // 抛出TypeError错误 // 给不可扩展对象的新属性赋值 var fixed = {}; Object.preventExtensions...(fixed); fixed.newProp = "ohai"; // 抛出TypeError错误 删除不可删除熟悉抛出异常 "use strict"; delete Object.prototype;...// 抛出TypeError错误,非严格模式时,无法删除但不报错 属性名唯一、函数参数名唯一 "use strict"; var o = { p: 1, p: 2 }; // !!!...语法错误,因为8进制和补零会冲突 197 + 142; var a = 0o10; // ES6: 八进制,用0o就没问题 禁止设置原始数据的属性 (function
扩展性和完整性级别的转换 Object.preventExtensions() 可以阻止将新属性添加到对象上。如果你尝试去这么做,它将会抛出一个异常。...作用相同,但是它还会通过将属性标记为不可写来阻止现有属性被修改。...当我们阻止了对b的扩展,我们对新的 shape 进行了一个特殊的转变 -- 将其标记为不可扩展。这个特殊的转变没有引入任何新的属性 -- 它实际上只是个标记。 ?...所有属性都被表达为Smi形式,而且最终的转变是将这个属性标记为不可扩展的扩展性转变。 现在我们需要将 y 修改为 Double 表达,意味着我们需要重新开始找到分离 shape。...但是现在 V8 有点困惑,因为分离 shape 是可扩展的但当前 shape 是被标记成了不可扩展的,而且 V8 不能确切地知道如何正确地重放转变。
推荐一篇文章《Angular 2 JIT vs AOT》介绍得非常详细。...// 代码生成器 参数:新 AST 对象 function codeGenerator(node) { switch (node.type) { // 遍历 body 属性中的节点,且递归调用...2 JIT vs AOT》[8] Reference [1] https://segmentfault.com/a/1190000008739157: https://segmentfault.com.../a/1190000008739157 [2] 编译器: https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E5%99%A8?...《Angular 2 JIT vs AOT》: https://segmentfault.com/a/1190000008739157
/mock-heroes'; 往类中添加一个 heroes 属性,这样可以暴露出这些英雄,以供绑定。... 2> 然后添加表示无序列表的 HTML 元素() 在 中插入一个 元素,以显示单个 hero 的属性。...Angular 会把所点击的 上的 hero 对象传给它,这个 hero 也就是前面在 *ngFor 表达式中定义的那个。...添加 click 事件处理器 把该组件的 hero 属性改名为 selectedHero,但不要为它赋值。 因为应用刚刚启动时并没有所选英雄。...添加如下 onSelect() 方法,它会把模板中被点击的英雄赋值给组件的 selectedHero 属性。
在此页面中,您将扩展“Tour of Heroes”应用程序,以显示英雄列表,并允许用户选择英雄并显示英雄的详细信息。 完成此页面后,该应用应该看起来像这个实例(查看源代码)。...添加一个onSelect()方法,将selectedHero属性设置为用户单击的英雄。...Angular无法显示null selectedHero的属性并抛出以下错误,在浏览器的控制台中可见: EXCEPTION: TypeError: Cannot read property 'name...在模板中,将以下绑定添加到标记中: [class.selected]="hero === selectedHero" 当表达式(hero === selectedHero)为true时,Angular...当表达式为false时,Angular删除选定的类。 ===运算符测试给定的对象是否相同。 在模板语法指南中阅读有关[class]绑定的更多信息。
领取专属 10元无门槛券
手把手带您无忧上云