前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你不知道的javaScript笔记(3)

你不知道的javaScript笔记(3)

作者头像
用户1197315
发布2018-01-22 11:55:53
6700
发布2018-01-22 11:55:53
举报
文章被收录于专栏:柠檬先生柠檬先生

对象

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

声明形式语法: 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

代码语言:js
复制
var myObject = {
    a:2
}
      myObject.a; //2    属性访问
      myObject["a"] // 2  键访问

ES6 可计算属性名

代码语言:js
复制
var prefix  = "foo";
var myObject = {
[prefix + "bar"] : "hello",
[prefix + "baz"]: "world"
};
myObject["foobar"]; // hello
myObject["foobaz"]; // world

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

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

2.configurable

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

代码语言:js
复制
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只用来删除对象的可删除属性。

代码语言:js
复制
var myObject = {
a:2
};
myObject.a  //2
delete myObject.a;
myObject.a // undefined

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

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

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

代码语言:js
复制
var myObject = {};
Object.defineProperty(myObject,"FAVORITE_NUMBER",{
value:42,
writable: false,
configurable: false
})

2.禁止扩展

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

代码语言:js
复制
  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

代码语言:js
复制
var  myObject = {
// 给 a 定义一个getter
get a() {
return 2;
}
}
myObject.a = 3;
myObject.a;  // 2

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

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

代码语言:js
复制
var myObject = {
// 给 a 定义一个getter
get a() {
return this._a_;
},
// 给 a 定义一个setter
set a(val) {
this._a_ = val * 2;
}
};
myObject.a = 2;
myObject.a; // 2

存在性

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

代码语言:js
复制
var myObject = {
a:2
};
("a" in myObject); // true
("b" in myObject); // false
myObject.hasOWnProper("a"); // true
myObject.hasOwnProperty("b"); // false

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

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

判断属性是否可枚举:

代码语言:js
复制
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 循环语法

代码语言:js
复制
  var myArray = [ 1,2,3];
  for(var v of myArray){
  console.log(v)
  }

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

代码语言:js
复制
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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-06-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档