为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript深入浅出

Bosn 资深架构师
难度中级
时长 5小时28分
学习人数
综合评分9.60
492人评价 查看评价
9.8 内容实用
9.5 简洁易懂
9.5 逻辑清晰
  • 当我们给对象赋值的时候它不会在原型链上查找,也就是当给obj.z赋值的时候,先看obj.z有没有,如果有的话修改它的值,如果没有的话仅在这个对象上添加这个z=5。

    这时,obj.hasOwnProperty('z')为true,因为obj上有z了;而foo.prototype.z仍为3,证明这个值没有被修改;而obj.z会返回5。

    如果给z赋值为undefined的话,那么访问obj.z就为undefined,这个值还是有的,只是值被改为了undefined。

    所以obj.z为undefined不一定是obj上没有z属性,也可能是它的值被赋为了undefined。这时可以通过hasOwnProperty或者in操作符来区分。

    如果想再拿到原型上的z,那么需要先delete obj.z,然后再去访问obj.z,这样对象上的属性就会被删除,拿到的就是foo.prototype.z。

    如果继续尝试delete obj.z,因为delete只能删除掉这个对象上的属性而不会影响到它的原型链。这样就实现了继承,通过这个继承我们可以继承原型链上的属性,反过来我们又不会修改它。

    查看全部
  • 1、创建函数foo(),每个函数都有一个prototype属性。

    2、先给foo.prototype属性添加一个属性z赋值3。每个对象都有一个proto标签。

    3、通过new foo()构造器的方式构造一个新对象obj,再给它添加属性x=1、y=2。通过构造器的方式创建的对象,它的原型会指向构造器的prototype属性,也就是foo.prototype。

    4、foo.prototype也有原型,它的原型是Object.prototype,Object.prototype的原型是null。

    5、toString方法是Object.prototype上的。

    6、因为z属性是obj从foo.prototype上继承来的,所以'z' in obj返回true;而obj.hasOwnProperty('z')返回false,证明z不是obj这个对象上的,而是它所在的原型链上的。

    查看全部
  • 可以通过字面量创建对象。对象字面量也可以做嵌套,比如某个属性的值可以又是对象,通过花括号来继续嵌套下去

    查看全部
  • 属性标签有:writable、enumerable、configurable、value,还提供了get/set方法,这些东西可以为每一个属性提供一个访问权限的控制,比如说是否可写、是否可以被删除掉、是否可以枚举。

    除此以外,每个对象还有一个原型。

    比如创建一个函数foo(),每一个函数都会有一个prototype这样一个对象属性。这个对象属性的作用:比如给foo.prototype.z设置为3,再去new一个foo()的话,那么指向的对象即obj,它的原型就会指向它的构造器的prototype属性,也就是foo.prototype。因为之前设置了foo的prototype属性的z属性是3,所以就会指向prototype的这样一个对象,并且它的z就位3。

    所以当访问obj的x属性的时候,那么在这个对象上返回1。如果访问obj.z,因为在obj上没有z,所以就会继续查找它的原型z=3那么就返回3;如果它的原型上还是没有z,那么就会继续向上查找,一直找到原型链的末端。

    除此之外,对象中还有一个class标签来表示它是属于哪一个种类的;还有一个extensible标签来表示这个对象是否允许继续增加新的属性。

    查看全部
  • 1、对象包含一系列属性

    2、属性是无序的

    3、每个属性都有key和value

    4、key是字符串

    5、value是对应的值

    查看全部
  • 严格模式的特点

    查看全部
  • 在一般模式下,如果在eval里面定义一个evalVal这样的变量的话,那么实际是eval所在的函数内部仍然可以拿到这个evalVal。

    而在严格模式下,eval的代码会在一个独立的作用域中执行,所以在这里拿evalVal是拿不到的

    查看全部
  • 严格模式下,eval、arguments变为关键字,不能作为变量、函数名,如果这样做的话会报'SyntaxError'

    查看全部
  • 一般模式下可以用‘0123’来表示一个八进制的值,实际输出的是83.

    在严格模式下是不允许这样的八进制的,如果这样写的话就会报'SyntaxError'语法错误。

    查看全部
  • 一般模式下,我们可以在对象的属性字面量去重复地写属性,这样是合法的,并且属性以最后一个为准,所以这里obj.x的值为2。

    但是这样重复属性名的方式在严格模式下是不允许的,所以会报'SyntaxError'语法错误。

    查看全部
  • 严格模式下delete不可配置的属性报错'TypeError'

    查看全部
  • 在一般模式下,如果想把一个参数用delete,那么实际上这样做没有什么意义,会返回一个false并且删除不成功,但是也不会报错。

    如果在严格模式下试图delete参数或者函数名的话都会报一个‘SyntaxError’语法错误。

    查看全部
  • 在一般模式下,如果我定义了一个函数,然后我调用它并且传参,那么这里的a和arguments[0]是有相互的一个绑定关系的。也就是在这里修改arguments[0]为100,那么这里的形参a也会修改为100。但是如果a没有传参,那么a就是undefined,不管arguments[0]修改为多少,a还是undefined,不会受arguments所影响。

    在严格模式下,arguments已经变为参数的静态副本,不管参数a传还是没有传,都不会对arguments相互影响,所在这里console.log(a)结果都是1。

    虽然形参a和arguments是没有相互绑定关系的,但是如果传入了一个对象的话,由于JS中是按照共享传递的所以这里面虽然说变量a不会受arguments影响,但是如果参数是对象的话,修改这个对象的属性,仍然是会相互影响的。

    查看全部
  • 一般模式下我们可以不声明一个变量而给它赋值,实际上相当于声明了一个全局变量。

    严格模式下如果给未声明的变量赋值那么就会报错‘ReferenceError’。

    查看全部
  • 严格模式下不允许使用with,如果使用with那么会报出一个‘SyntaxError’语法错误。

    查看全部

举报

0/150
提交
取消
课程须知
1.您至少学习了本站“JS入门”、“JS进阶”两门基础课程。 2.如您具备一定实践经验对学习有很大帮助。 3.如您没有脚本编程开发经验,学习过程有可能会受挫部分内容或示例代码,请“暂时略过不懂的部分,后面章节会阐述”,当然想透彻学习,还需大量实践来体会知识的内涵。
老师告诉你能学到什么?
结合实例,深入解析以下知识内容: 1. 数据类型、表达式和运算符、语句; 2. 对象、数组、变量、函数; 3. this、闭包和作用域; 4. OOP; 5. 正则与模式匹配。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!