JS基础知识
1、JavaScript简单的类型包括数字、字符串、布尔值(true和false)、null值和undefined值。其他所有的值都是对象。
2、JavaScript中的对象是可变键控集合。在JavaScript中,数组是对象,函数是对象,正则表达式是对象,对象也是对象。
3、对象是属性的容器,每个属性都拥有名字和值。属性的名字可以是包括空字符串在内的任意字符串。属性值可以是除undefined值之外的任何值。
4、检索对象中包含的值,可以用[],也可以用.(前提是属性字符串是一个常数,且是一个合法的JavaScript标识符并非保留字),优先考虑用.表示法,因为它可读性更好。
var Person = {
"first-name" : "Li",
"middle-name" : "Jin",
"last-name" : "Xin",
'age' : 23,
}
Person["first-name"]; // Li
Person.age; // 23
对象字面量
对象字面量提供了一种非常方便地创建新对象的表示方法。一个人对象字面量就是包围在一对{ }中的零或多个“名/值”对。对象字面量可以出现在任何允许表达式出现的地方。
var stooge_object = ();
var stooge = {
"first-name": "Jerome",
"last-name": "Howard"
};
属性的值可以从包括另一个对象字面量在内的任意表达式中获得。对象是可以嵌套的:
var flight = {
airline:"Oceanic",
number: 815,
departure: {
Name: "LiJinXin",
time: "2021-07-10 13:40",
city: "Nanchang"
},
arrival: {
Name: "LiangYanLing",
time: "2021-07-09 15:20",
city: "Nanchang"
},
};
检索
检索一个不存在的成员元素的值将会返回一个undefined值;
运算符“||” 可以用来填充默认值;
检索一个undefined值将会导致TypeError异常。可以通过&& 运算符来避免错误。
更新
对象中的值可以通过赋值语句来更新。如果已经存在于对象中,那么这个值将会被替换。
如果对象之前并没有拥有那个属性名,那么该属性将会扩充到该对象中。
stooge['middle-name'] = 'Jerome';
stooge.nickname = 'Curly';
flight.equipment = {
model: 'Boeing 777'
};
flight.status = 'overdue';
引用
对象通过引用来传递。它们永远不会被拷贝:
var x = stooge;
x.nickname = 'Curly';
var nick = stooge.nickname;
// 因为 x 和 stooge 是指向同一个对象的引用,所以nick 为 ‘Curly’
var a = {}, b = {}, c = {};
// a、b和c 每个都引用不同的空对象
a = b = c = {};
// a、b和c 都引用同一个空对象
原型
每个对象都连接到一个原型对象,并且它可以从中继承属性。
原型连接在更新时是不起作用的。当我们对某个对象做出改变时,不会触及到该对象的原型。
原型连接只有在检索值的时候才会被引用。
原型关系是一种动态的关系。如果我们添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。
stooge.profession = 'actor';
another_stooge.profession // 'actor'
反射
typeof 操作符对确定属性的类型很有帮助
原型链中的任何属性都会产生一个值
处理不需要的属性的两个方法:
1.让你的程序检查并剔除函数值。一般来说做反射的目标是数据,因此你应该意识到一 些值可能会是函数。
2.使用 hasOwnProperty 方法,如果对象拥有独特的属性,它将返回 true。
hasOwnProperty 方法不会检查原型链。
枚举
for in 语句可以遍历一个对象中的所有属性名。该枚举过程会列出所有的属性包括函数和你可能不关心的原型中的属性,所以有必要过滤掉那些不想要的值。最常用 的过滤器是 hasOwnProperty 和 typeof 来排除函数:
var name;
for (name in another_stooge) {
if (typeof another_stooge[name] !== 'function') {
document.writeln(name + ':' + another_stooge[name]);
}
}
创建数组,在其中以正确的顺序包含属性名:
var i;
var properties = {
'first-name',
'middle-name',
'last-name',
'profession'
};
for (i = 0; i < properties.length; i += 1) {
document.writeln(properties[i] + ':' +
another_stooge[properties[i]]);
}
通过使用 for 而不是使用 for in ,可以得到我们想要的属性,而不是担心可能发掘出原型链中的属性,并且我们按正确的属性取得了它们的值。
删除
delete 运算符可以用来删除对象的属性。它将会移除对象中确定包含的属性。它不会触及原型链中的任何对象。
删除对象的属性可能会让来自原型链中的属性浮现出来:
another_stooge.nickname // 'Moe'
// 删除 another_stooge 的 nickname 属性, 从而暴露出原型的 nickname 属性
delete another_stooge.nickname;
another_stooge.nickname // 'Curly'
减少全局变量污染
JavaScript 可以很随意地定义那些可保存所有应用资源的全局变量。因此,全局变量削弱了程序的灵活性,所以应该避免。
只创建唯一一个全局变量:
var MYAPP = {};
该容器此时变成了你的应用容器:
MYAPP.stooge = {
"first-name": "Li",
"last-name": "Jinxin"
};
MYAPP.flight = {
airline: "Oceanic",
number: 815,
departure: {
Name: "LiJX",
time: "2021-07-09 14:24",
city: "Nanchang"
},
arrival: {
Name: "LiangYL",
time: "2021-07-09 14:24",
city: "Nanchang"
},
}
只要把多个全局变量都整理在一个名称空间下,你将显著的降低与其他应用程序、组件或类库之间产生糟糕的互相影响的可能性。你的程序也会变得更容易阅读,因为很明显 MYAPP.stooge 指向的是顶层结构。