下面是 MDN上关于严格模式的解释:严格模式 变量必须显式声明 函数的形参必须有唯一的名称(否则会报语法错误) 不能使用with 给只读的属性赋值会报错 像 00840 这样的八进制数字会报语法错误 试图...delete 无法删除的属性会报错 delete prop 会报语法错误,可以使用 delete global[prop] eval 不会在所在的词法作用域引入新的变量 eval 和 arguments...不能被改变或赋值 arguments 不会跟踪方法的参数变化 arguments.callee 不再支持,会报 TypeError arguments.caller 不再支持,会报 TypeError...同样的,ES6 模块内部的声明只在模块内部有效。这就意味着,某个模块中的变量,如果没有被导出,在其他模块中就无法使用。...Named Exports 在 CommonJS 中导出时也不是必须将 module.exports 赋值为一个对象,你可以直接改变它的属性。
module.exports对象是由模块系统创建的。 有时这是难以接受的;许多人希望他们的模块成为某个类的实例。 为了实现这个,需要将期望导出的对象赋值给module.exports。...注意,将期望的对象赋值给exports会简单地重新绑定到本地exports变量上,这可能不是你想要的。...注意,就像任何变量,如果一个新的值被赋值给exports,它就不再绑定到module.exports(其实是exports.属性会自动挂载到没有命名冲突的module.exports.属性) require...和module.exports同时赋值时,exports所使用的属性和方法必须出现在module.exports,若属性没有在module.exports中定义的话,出现undefined,若方法没有在...module.exports中定义,会抛出TypeError错误。
这个变量是一个对象,它的 exports属性(即module.exports)是对外的接口,加载某个模块,其实是加载该模块的module.exports属性。...exports.hello = function() { return 'hello'; }; module.exports = 'Hello world'; 上面代码中,hello函数是无法对外输出的.../xxx.js' a = {}; // Syntax Error : 'a' is read-only; 上面代码中,脚本加载了变量a,对其重新赋值就会报错,因为a是一个只读的接口。.../lib'; obj.prop = 123; // OK obj = {}; // TypeError 上面代码中,main.js从lib.js输入变量obj,可以对obj添加属性,但是重新赋值就会报错...data对象具有默认导出的default属性,其他属性具有指定exports的名称及其对应的值。
'use strict'; NaN = 3; //TypeError: Cannot assign to read only property 'NaN' of #Object> 给不可写属性赋值,...给只读属性(getter-only)赋值赋值, 给不可扩展对象(non-extensible object)的新属性赋值) 都会抛出异常: "use strict"; // 给不可写属性赋值 var...: Cannot assign to read only property 'x' of #Object> // 给只读属性赋值 var obj2 = { get x() {...// 给不可扩展对象的新属性赋值 var fixed = {}; Object.preventExtensions(fixed); fixed.newProp = "haha"; // TypeError...所以with中块内的x究竟是指全局变量x还是obj.x在运行之前是无法得知的,这对编译器优化十分不利,因此严格模式禁用 with。
不允许对只读属性操作 // 非严格模式 // 操作静默失败,即不报错也没有任何效果 // 给不可写属性赋值 var obj = {}; Object.defineProperty(obj, "x",...{value:0, writable:false}); obj.x = 1; console.log(obj.x); // 0 // 给只读属性赋值 var obj = { _x: 0,..._x; } }; obj.x = 1; console.log(obj.x); // 0 // 给不可扩展对象的新属性赋值 var obj = {}; Object.preventExtensions...: Cannot assign to read only property 'x' of object '#Object>' // 给只读属性赋值 var obj = { _x: 0,...// 给不可扩展对象的新属性赋值 var obj = {}; Object.preventExtensions(obj); obj.x = 1; // Uncaught TypeError: Cannot
这个变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口。加载某个模块,其实是加载该模块的 module.exports 属性。.../module.js' 此外,要注意两点: export default 实际上是把后面跟着的东西赋值给 default 变量,所以后面不能是变量的声明 因为 export default 是指定的默认输出...因为 module.exports 对象中的 num 属性本来就有值的拷贝了,此方法并不能证明值的拷贝是由 CommonJS 的底层实现的。...另外,原模块导出的变量在 main.js 中表现为一个只读常量,也就是说我们不能在 main.js 中对它重新赋值,这会报错: import { num,obj } from '....对于引用类型,可以给它添加属性,但赋值同样是不行的。
"; // 这一行代码就会抛出 ReferenceError 静默失败的赋值操作也抛出异常 "use strict"; // 给不可写属性赋值 var obj1 = {}; Object.defineProperty...(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 }; // !!!
对象 1.1. 属性描述符 在 ES5 之前,JavaScript 语言本身并没有提供可以直接检测属性特性的方法,比如判断属性是否是只读。但是从 ES 开始,所有的属性都具备了属性描述符。...属性赋值[[Set]] ? ? ? 2. 原型 [[Prototype]] JavaScript 中的对象都有一个特殊的 [[Prototype]] 内置属性,其实就是对于其他对象的引用。...如果 myObject 对象中包含名为 foo 的普通数据访问属性,这条赋值语句只会修改已有的属性值。...如果在 [[Prototype]] 链上层存在名为 foo 的普通数据访问属性并且没有被标记为只读(writable:false),那么会直接在 myObject 中添加一个名为 foo 的新属性。...如果在 [[Prototype]] 链上层存在 foo,但是它被标记为只读 (writable: false),那么无法修改已有属性或者在 myObject 上创建屏蔽属性。
大概就是将对象里面的一些属性转换成数组,方便解构赋值的进行。但Symbol.iterator的兼容性并不好(如下图),还是谨慎使用为妙。 ?...es2015开始新增了在对象中用中括号解释属性的功能,这对变量、常量等当对象属性尤其有用。...新增了一个_defineProperty函数,给新建的_obj = {}进行属性定义。除此之外使用小括号包住一系列从左到右的运算使整个定义更简洁。...})); } // 给传入的object定义strings和raw两个不可变的属性。...用类的好处写继续更加方便,但无法用mixin,需要借助更新的es7语法中的decorator才能够实现类mixin的功能(例如pureRender)。
本文给大家分享sea.js知识总结,感兴趣的朋友一起学习吧 http://reactjs.cn/ http://reactjs.cn/react/docs/getting-started-zh-CN.html... ]; let map = new Map(); // 返回模块的输出对象 //modue.exports = arr; // es6 模块返回的对象 // 使用 import * as...id // 每一个元素都有一个 key 值, // 这里循环的元素 react 无法动态的给元素一个 id...as util // 将导入的模块下返回的所有数据以对象的形式 赋值给 util, import * as Util from "....Image.png js是弱类型: 整型 传过去会可能变成字符串型的数据: 加斜杠的原因: ? Image.png 直接接收就行,不需要再写解构赋值了 es6中的bug ?
由于元组类型是数组的子类型所以元组类型可以赋值给数组类型,前提是元组中的每一项都符合数组的每一项类型;数组类型是不能赋值给元组类型的。...= new Date(); // OK object object 相比较于 Object 更加严格,只能是对象类型,而不能是 boolean 这样的原始数据类型,同样的也只能调用 Object 类型定义的属性和方法...看一个稍微复杂一点的例子: const a: 'a' = 'a'; // 注意这里的类型使用了 'a' 而不是string, 如果是string则不能用在对象中作为属性 const b: unique...new (foo as any)('123'); // OK 接口 接口可以定义任意对象类型,但无法表示原始类型。...readonly b: number = 1; // 定义一个只读属性b 只读属性必须赋初始值 readonly c: number; // 只读属性初始值在构造函数中赋值 如果不赋值则报错
在普通的JavaScript里面给一个拼写错误的变量名赋值会使全局对象新增一个属性并继续“工作”(尽管后面可能出错:在现在的JavaScript中有可能)。...任何在正常模式下引起静默失败的赋值操作 (给不可写属性赋值, 给只读属性(getter-only)赋值赋值, 给不可扩展对象(non-extensible object)的新属性赋值) 都会抛出异常:...“use strict”; // 给不可写属性赋值 var obj1 = {}; Object.defineProperty(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 = “
另外需要注意的事,同样不能依赖当前的Props计算下个状态,因为Props一般也是从父组件的State中获取,依然无法确定在组件状态更新时的值。...this.setState({title: 'Reactjs'}); React会合并新的title到原来的组件状态中,同时保留原有的状态content,合并后的State的内容为: { title...状态的类型是普通对象(不包含字符串、数组) 1,使用ES6 的Object.assgin方法。...// 方法一:将state先赋值给另外的变量,然后使用Object.assign创建新对象 var owner = this.state.owner; this.setState({ owner:...=> ({ owner: Object.assign({}, preState.owner, {name: 'Jason'}); })) 2,使用对象扩展语法 // 方法一:将state先赋值给另外的变量
可以使用Object的getOwnPropertyDescriptor方法,帮助获取对象上某个属性的属性描述符。如果不存在则会返回undefined。...(Object.getOwnPropertyDescriptor(obj, 'interest')); // => undefined示例代码中不存在interest属性,但是也不是不可以有。...Object.defineProperty()方法可以帮助对象创建一个指定了特性的属性。...,并创建具体普通对象无法企及能力的代理对象。...代理对象可以从目标对象和处理器对象上获取它们的行为,进行特定处理;也可以只拦截对象操作,但仍然把操作委托给目标对象。前一种方式可以帮助创建一个只读器,所有试图写入的操作都会抛出异常。
const声明一个只读的常量。一旦声明,常量必须进行初始化且初始化的值就不能改变。...; // TypeError: "foo" is read-only 上面代码中,常量foo储存的是一个地址,这个地址指向一个对象。...,但是如果将另一个数组赋值给a,就会报错。...const foo = Object.freeze({}); // 常规模式时,下面一行不起作用; // 严格模式时,该行会报错 foo.prop = 123; 上面代码中,常量foo指向一个冻结的对象...除了将对象本身冻结,对象的属性也应该冻结。下面是一个将对象彻底冻结的函数。
s.concat(repeat(s, --n)) : "";}实现深拷贝浅拷贝: 浅拷贝指的是将一个对象的属性值复制到另一个对象,如果有的属性的值为引用类型的话,那么会将这个引用的地址复制给对象,因此两个对象会有同一个引用类型的引用...;}// Module的实现很简单,就是给模块创建一个exports对象,tryModuleLoad执行的时候将内容加入到exports中,id就是模块的绝对路径// 定义模块, 添加文件id标识和exports...然后通过new Module实例化的方式创建module对象,将模块的绝对路径存储在module的id属性中,在module中创建exports属性为一个json对象// 使用tryModuleLoad...tryModuleLoad执行完毕之后module.exports已经存在了,直接返回就可以了// 给模块添加缓存// 添加缓存也比较简单,就是文件加载的时候将文件放入缓存中,再去加载模块时先看缓存中是否存在...我给你解释一下与之相对的弱引用的概念你就明白了在计算机程序设计中,弱引用与强引用相对,被弱引用的对象可以在任何时候被回收,而对于强引用来说,只要这个强引用还在,那么对象无法被回收。
参考链接: Python @property装饰器 @property:(把方法变成属性调用) Python内置的@property装饰器就是负责把一个方法变成属性调用的 Python允许我们在程序中手动设置异常...,于是,我们就拥有一个可控的属性操作 # 例1:学生分数设置和获取 class Student(object): @property def score(self): ...,只定义getter方法,不定义setter方法就是一个只读属性 # 例2:学生生日的设置和获取 class Student(object): @property def birthday..._birthday s1 = Student() s1.birthday = 1998 print(s1.birthday) print(s1.age()) 请利用@property给一个Screen对象加上...width和height属性,以及一个只读属性resolution # 例3:计算长方形的面积 class Screen(object): @property def width(self
如果允许属性赋值操作,它也总是在原始对象上创建属性或对已有的属性赋值,而不会去修改原型链。在JavaScript中,只有在查询属性是才会体会到继承的存在,而设置属性则和继承无关。...delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性。...一旦将对象转换为不可扩展的,将无法再将其转换回可扩展的了。...需要注意,Object.preventExtensions()只影响到对象本身的可扩展性,如果给一个不可扩展的对象的原型添加属性,这个不可扩展的对象同样会继承这些新属性;至此提供了一种从“可扩展”->“...Object.preventExtensions()[不可扩展] -> Object.seal()[不可扩展、自有属性不可配置] -> Object.freeze()[不可扩展、自有属性不可配置、数据属性设置为只读
exports.name = name; exports.sayName = function() { console.log(name); } 给 exports 赋值其实是给 module.exports...这个空对象添加了两个属性而已,上面的代码相当于: var name = 'nswbmw'; module.exports.name = name; module.exports.sayName...这是因为,前面的例子中通过给 exports 添加属性,只是对 exports 指向的内存做了修改,而 exports = function(r) { return r * r * Math.PI...,所以我们在 app.js 中调用 area(4) 会报 TypeError: object is not a function 的错误。...所以,一句话做个总结:当我们想让模块导出的是一个对象时, exports 和 module.exports 均可使用(但 exports 也不能重新覆盖为一个新的对象),而当我们想导出非对象接口时,就必须也只能覆盖
要修改默认属性的特性,必须使用 ES5 的 Object.defineProperty() 方法。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。...另外需要注意的是当configurable设置为false后无法再将其改为true,且除了writable之外,无法修改其它特性。...在configurable为true的情况下可多次调用Object.defineProperty( )修改同一属性。 在非严格情况下修改无法配置的属性操作会被忽略,在严格模式下会抛出错误。...[[Configurable]] 把 configurable 设置为 false,表示不能从对象中删除属性,如果对这个属性调用 delete,则在非严格模式下什么都不会发生,严格模式下报错。...一旦被设置为 false,那么该属性值就不能被修改(只读)。
领取专属 10元无门槛券
手把手带您无忧上云