JavaScript的简单类型包括
1.数字number
JS不分整形和浮点型,都是number类型
两个浮点数相加,精度不够
2.字符串 string
3. 布尔值 boolean
4. null
5. underlined
6.复杂对象、Function、Array
以上都是简单数据类型
其他都是对象Function Array
研究一下 前五个都是疑似对象 因为他们拥有方法 但是他们是不可改变的?
简单数据类型,不是对象?
数字、字符串、布尔值貌似对象,因为他们拥有方法,但他们是不可变的
对象是可变的键控集合。
数组、函数、正则表达式都是对象,对象是属性的容器
尝试检索一个undefined的值会倒是typeerror异常,&&运算符来避免错误
a.b&&a.b.c //undefined
3.5 原型
当创建一个新对象时,可以选择某个对象为其原型,可以尝试给 Object 添加一个 create 方法,它可以创建一个使用原对象作为其原型的新对象。
var box={
check:'book',
checkbox:{
check:'pencil',
price:'30元'
},
getPrice:function(){
return '25元'
}
}
if(typeof Object.beget!=='function'){
Object.create=function(o){
var F=function(){};
F.prototype=o;//使其原型改为传进来的对象
return new F();
}
}
var goodsInfo=Object.create(box)
console.log(goodsInfo.check)//'book'
console.log(goodsInfo.getPrice())//'25元'
3.6 反射
检查并确定对象具有的属性,只有进行检索并验证即可,通常使用typeof
typeof box.check; //"string"
typeof box.checkbox; //"object"
typeof box.getPrice; //"function"
但原型链中的任何属性还会产生同一个值constructor
typeof box.toString; //'function'
typeof box.constructor; //'function'
为了处理掉这些不需要的属性,可以换种方法来验证,比如利用hasOwnProperty
box.hasOwnProperty("check"); //true
box.hasOwnProperty("getcheck"); //false
它用来检验是否是对象独有的属性,它将返回对应的布尔值,它不会检查原型链
3.7 枚举法
for in 语句用来遍历对象中的所有属性名。该枚举过程会列出所有的属性(包括函数和原型链中的属性 )
var father = {
fatherAttr: 1
};
// 以father为原型创建对象实例instance
var instance = Object.create(father);
instance.a = 1;
instance.b = 1;
instance.c = 1;
for (var attr in instance) {
console.log(attr, instance[attr]);
}
// a 1
// b 1
// c 1
// fatherAttr 1
// 获取instance实例的自有属性名
console.log(Object.getOwnPropertyNames(instance));
// ["a", "b", "c"]
同时一般利用 typeof 来排除不想要的函数
var box = {
check: "book",
checkbox: {
check: "pencil",
price: "30元",
},
getPrice: function () {
return "25元";
},
};
for (name in box) {
if (typeof box[name] !== "function") {
console.log(name + ":" + box[name]);
//check:book
//checkbox:[object Object]
}
}
属性名具有不确定性,因此要以特定的顺序出现,最好的方法是避免for in的使用,而是创造一个数字,包括正确的属性名。
var box = ["book", "pencil", "30元"];
for (let i = 0; i < box.length; i++) {
console.log(box[i]);
}
for in不仅可以遍历对象,数组,还可以遍历字符串。
3.8 删除
delete 运算符可以用来删除某对象的属性,若此对象含有该属性,则移除(不会对原型链中的对象产生影响)
删除某对象的属性,可能会让它原型链中的此属性表现出来
若原型链 object 上有 a 属性,而对象 A 身上也有 a 属性,则 A 使用时以自身为准(这也是为什么,删除 A 身上的 a 属性时,A 身上的 object 的 a 属性生效的原因)
function Pro() {}
Pro.prototype = {
constructor: Pro,
name: "proto",
sex: "boy",
hobby: "coding",
};
var fakePro = new Pro();
fakePro.hobby = "钓鱼";
console.log(fakePro.hobby); //'钓鱼'
delete fakePro.hobby;
console.log(fakePro.hobby); //'coding'