专栏首页柠檬先生你不知道的javaScript笔记(3)

你不知道的javaScript笔记(3)

对象

对象可以通过两种形式定义: 声明形式和构造形式

声明形式语法: var myObj = {key:value}

构造形式语法: var myObj = new Object(); myObj.key = value;

类型: 语言类型有六种 : string number boolean null undefined object

内置对象: String Number Boolean Object Function Array Date RegExp Error

var myObject = {
    a:2
}
      myObject.a; //2    属性访问
      myObject["a"] // 2  键访问

ES6 可计算属性名

var prefix  = "foo";
var myObject = {
[prefix + "bar"] : "hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world

1.writable   决定是否可以修改属性的值

var myObject = {};
Object.defineProperty(myObject,"a",{
value:2,
writable:false, // 不可写!
configurable: true,
enumerable: true
});
myObject.a = 3;
myObject.a;   // 2

2.configurable

只要属性是可配置的,就可以使用defineProperty(..) 方法来修改描述属性。

var myObject = {
a : 2
};
myObject.a = 3;
myObject.a; // 3
Object.defineProperty(myObject,"a",{
value: 4,
writable:true,
configurable:false,// 不可配置
enumerable: ture
});
myObject.a; // 4
myObject.a = 5;
myObject.a; // 5
Object.defineProperty(myObject,"a",{
value: 6,
writable:true,
configurable:true,
enumerable: ture
})   // TypeError

configurable 修改成flash 是单向的,无法撤销

delete只用来删除对象的可删除属性。

var myObject = {
a:2
};
myObject.a  //2
delete myObject.a;
myObject.a // undefined

3.enumerable    控制的是属性是否出现在对象的属性枚举中。

1.对象常量,结合writable: false 和configurable: false 就可以创建一个真正的常量属性

(不可修改,重定义或者删除)。

var myObject = {};
Object.defineProperty(myObject,"FAVORITE_NUMBER",{
value:42,
writable: false,
configurable: false
})

2.禁止扩展

禁止一个对象添加新属性并保留已有属性,可以使用Object.preventExtensions(...)

  var myObject = {
a:2
};
Object.preventExtensions(myObject);
myObject.b = 3;
myObject.a; // undefined

3.封存

Object.seal(...) 会创建一个 “封存的对象”,这个方法实际上会在一个现有对象上调用

Object.preventExtensions(...) 并把所有属性标记为configurable:false.

4.冻结

Object.freeze(...) 会创建一个冻结对象,这个方法实际上是会在一个现有对象上调用

Object.seal(...) ,还可以深度冻结一个对象。

Getter和Setter

var  myObject = {
// 给 a 定义一个getter
get a() {
return 2;
}
}
myObject.a = 3;
myObject.a;  // 2

由于只定义了 a 的getter,所以对a 的值进行设置时set 操作会忽略赋值操作,不会抛出错误。

通常来讲getter 和setter是成对出现的

var myObject = {
// 给 a 定义一个getter
get a() {
return this._a_;
},
// 给 a 定义一个setter
set a(val) {
this._a_ = val * 2;
}
};
myObject.a = 2;
myObject.a; // 2

存在性

可以在不访问属性的情况下判断对象中是否存在这个属性:

var myObject = {
a:2
};
("a" in myObject); // true
("b" in myObject); // false
myObject.hasOWnProper("a"); // true
myObject.hasOwnProperty("b"); // false

in 操作符会检查属性是否在对象及[[Prototype]]原型链中。

hasOwnProperty(...) 只会检查属性是否在myObject对象中。

判断属性是否可枚举:

var  myObject = {};
Object.defineProperty(
myObject,
"a",
// 让a像普通属性一样可枚举
{enumerable: true,value:2}
);
Object.defineProperty(
myObject,
"b",
// 让b 不可枚举
{enumerable: false,value:3}
)
myObject.propertyIsEnumberable("a"); // true
myObject.propertyIsEnumber("b"); // false
Object.keys(myObject);  // ["a"]
Object.getOwnPropertyName(myObject); // ["a","b"]

propertyIsEnumerable(...)  会检查给定的属性名是否直接存在于对象中(而不是在原型链)并且满足enumerable:true

Object.keys(...) 会返回一个数组,包含所有可枚举属性

Object.getOwnPropertyNames(...) 返回一个数组,包含所有属性,无论是否可枚举

遍历

 for .. in 可以用来遍历对象的可枚举属性列表

对于数值索引的数组来说,可以使用标准的for 循环

ES5 中新增的   forEach(..)  every(...)  some(..)

forEach(...) 会遍历数组中所有值并忽略回调函数的的返回值。

every(...) 会一直运行到回调函数返回false

some(...) 会一直运行到回调函数返回true

Es6 增加  for .. of 循环语法

  var myArray = [ 1,2,3];
  for(var v of myArray){
  console.log(v)
  }

普通的对象没有@@iterator,可以给任何想遍历的对象自定义

var myObject = {
  a:2,
  b:3
};
Object.defineProperty(myObject,Symbol.iterator,{
enumerable: false,
writable: false,
configurable: true,
value: function() {
var o = this;
var idx = 0;
var ks = Object.keys(o);
return {
next: function(){
value: o[ks[idx++]],
done:(idx > ks.length)
}
}
}
})
// 手动遍历myObject
var it = myObject[Symbol.iterator]();
it.next(); // {value:2,done: false}
it.next(); // {value:3,done: false}
it.next(); // {undefined,done: true}
// 用 for..of 遍历myObject
for(var v of myObject){
  console.log(v)
}  // 2 // 3

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • es6 对象的扩展

    1.属性的简洁表示法     function f(x,y) {       return {x,y};     }     // 等同于     functi...

    用户1197315
  • es6 数组扩展方法

    1.扩展运算符     含义: 扩展运算符,三个点(...),将一个数组转为用逗号分隔的参数顺序。       例如:         console.log(...

    用户1197315
  • 你不知道的javaScript笔记(5)

    原生函数   常用的原生函数     String()     Number()     Boolean()     Array()     Object() ...

    用户1197315
  • Go——依赖管理

    在Go1.5 release的版本的发布vendor目录被添加到除了GOPATH和GOROOT之外的依赖目录查找的解决方法。 查找依赖包路径的解决 当前包下...

    羊羽shine
  • 【申报倒计时3天】2019年CCF-腾讯犀牛鸟基金项目申报即将截止

    ? ? 【申报倒计时3天】 2019年CCF-腾讯犀牛鸟基金 2019年CCF-腾讯犀牛鸟基金项目申报将于2019年6月15日24:00(本周六)截止,请尚未...

    腾讯高校合作
  • 剑指offer 03:二维数组中的查找

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个...

    程序员小浩
  • HDOJ/HDU 2539 点球大战(String.endsWith()方法的一个应用~)

    Problem Description 在足球比赛中,有不少赛事,例如世界杯淘汰赛和欧洲冠军联赛淘汰赛中,当比赛双方经过正规比赛和加时赛之后仍然不分胜负时,...

    谙忆
  • NERVE:一款为渗透测试设计的多功能网络安全&漏洞利用引擎

    我们认为,安全扫描应当是一件需要持续去做的事情,这种持续性并不是指每天、每周、每个月或每个季度,我们指的是每一分每一秒!这种持续性的安全扫描方式适用于以下几种场...

    FB客服
  • 如何才能成为人力资源数据分析专家

    人力资源的数据分析是一个系统化的学习过程,除了需要掌握基础数据分析知识外,还需要掌握EXCEL的技能和人力资源的专业能力,为了帮助大家更好的学习数据分析,我...

    王佩军
  • 企业应如何正确选择网站空间服务器

    互联网的发展对传统行业、实体店带来了强大的冲击,为了适应时代的发展,不少企业或个人不得不选择搭建网站来维持现有的或新的业务来源。网站建设的好坏直接关乎着企业的成...

    悉知科技建站

扫码关注云+社区

领取腾讯云代金券