JavaScript的简单类型包括以下几种:
1.数字 number
JS不分整形和浮点型
两个浮点数相加,精度不够
2.字符串 String
3.布尔值 boolean
4.null
5.undefined
以上都是简单数据类型
其他都是对象 Function Array
研究一下 前五个貌似是对象, 因为他们拥有方法,但是他们是不可变的?
var num = 123;
console.log('num=' + num + '--type :' + typeof num);
num = new Number(123);
console.log('num=' + num + '--type :' + typeof num);
var bool = true;
console.log("bool = " + bool + "-- type : " + typeof bool);
bool = new Boolean(true);
console.log("bool = " + bool + "-- type : " + typeof bool);
var str1 = "hello";
console.log("str = " + str1 + "-- type : " + typeof str1);
string = new String("hello");
console.log("str = " + str1 + "-- type : " + typeof str1);
控制台输入结果如下:
可以看到,对于number和boolean类型的数据来说,调用构造函数进行封装后,类型变为object。而对于string来说,调用构造函数后类型仍然为string,所以,字符串虽然是一个基本类型,但是存储的时候是按照对象的方式存储的。
var num = 123;
var str3 = num.toString();
console.log(str3 + " ----- type : " + typeof str3);
控制台输入结果如下:
解释器底层对number类型的123封装成了一个对象,然后调用了对象的方法
对象字面量
一个对象字面量就是包围爱一对花括号中的零或多个“键 / 值”对(类似于python的字典),可以出现在任何允许表达式出现的地方.
let mm = {
name: '喻一凡',
hometown: '奉新',
isSingle: true,
};
属性名可以是包括字符串在内的任何字符串,在对象字面量中,如果属性名是一个合法的JS标识符且不是保留字,并不强制要求用括号括住属性名,逗号用来分隔多个“键 / 值”对,对象是可嵌套的
var emp1 = {
number: 123,
departure: {
TA: 'SYD',
time: '2021-07-05 20:00',
city: 'newyork'
}
}
检索
要检索对象中包含的值,可以采用在[ ]后缀中括住一个字符串表达式的方式,如果字符串表达式是一个常数,而且它是一个合法的JS标识符而非保留字,那么也可以用表示法代替,优先考虑使用表示法,因为它更紧凑且可读性更好
console.log(emp1["number"]);
console.log(emp1.departure.TA);
控制台输入结果如下:
如果你尝试检索一个并不存在的成员元素的值,将返回一个undefined值
console.log(emp1["baba"]);
console.log(emp1.aaaaaa);
控制台输入结果如下:
| | 运算符可以用来填充默认值:
var middle = emp1["middle-name"] || "(none)";
var birthday = emp1.number || 2000;
console.log(middle);
console.log(birthday);
控制台输入结果如下:
尝试检索一个 undefined 值将会导致TypeError 异常,这可以通过 && 运算符来避免错误
console.log(emp1.fight); //undefined
console.log(emp1.fight.add); //throw "TypeError"
console.log(emp1.fight && emp1.fight.add); //undefined
更新
对象中的值可以通过赋值语句来更新,如果属性名已经存在于对象中,那么这个属性的值将被替换,如果之前不存在该属性名,那么该属性就会被扩充到该对象中
console.log(emp1["number"] = 1231);
emp1.birthday = '2000-12-31';
emp1.equipment = {
model: 'BeiJing'
};
console.log(emp1)
控制台输入结果如下:
引用
对象通过引用来传递,它们永远不会被拷贝:
var x = emp1;
x.nickname = 'curry';
var nick = emp1.nickname;
console.log(nick);
控制台输入结果如下:
原型
每个对象都连接到一个原型对象,并且可以从中继承属性,所有通过对象字面量创建的对象都连接到object.prototype 这个JS标准的对象
当你创建一个新对象时,你可以选择某个对象作为它的原型。
原型连接在更新时是不起作用的,当我们对某个对象做出改变时,不会触及到该对象的原型。
原型关系是一种动态的关系,如果我们添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。
反射
typeof 操作符可以确定属性的类型
console.log(typeof emp1.number);
console.log(typeof emp1.departure);
console.log(typeof emp1.departure.time);
console.log(typeof emp1.toString); //该属性为原型对象的属性
控制台输入结果如下:
有两个方法去处理这些不需要的属性,第一个是让你的程序检查并剔除函数值。另一个方法是使用hasOwnProperty 方法,如果对象拥有独有的属性,它将返回 true,此方法不会检查原型链
console.log(emp1.hasOwnProperty('number'));
console.log(emp1.hasOwnProperty('aaa'));
控制台输入结果如下:
枚举
for in 语句可用来遍历一个对象中的所有属性名,可结合过滤器hasOwnProperty方法,以及使用typeof来排除你不想要的值以及函数
var name;
for (name in emp1) {
if (typeof emp1[name] !== 'function') {
console.log(name + ':' + emp1[name]);
}
}
控制台输入结果如下:
属性名出现的顺序是不确定的,如果你想要确保属性以特定的顺序出现,可以先创建一个数组,在其中以正确的顺序包含属性名,再通过for循环遍历数组中的元素(该方法也不用担心发掘出原型链中的属性)。
var i;
var properties = ['number',
'departure',
'birthday',
'equipment',
'nickname'
];
for (i = 0; i < properties.length; i++) {
console.log(properties[i] + ':' + emp1[properties[i]])
}
控制台输入结果如下:
删除
delete 运算符可以用来删除对象的属性,它不会触及原型链中的任何对象,删除对象的属性可能会让来自原型链中的属性浮现出来
减少全局变量污染
JS可以很随意地定义那些可保存所有资源的全局变量,但是,全局变量削弱了程序的灵活性,所以应该避免。
最小化使用全局变量的一个方法是在你的应用中只创建唯一一个全局变量
var MYAPP = {};
此时该变量变成了你的应用容器:
MYAPP.emp1 = {
number: 123,
departure: {
TA: 'SYD',
time: '2021-07-05 20:00',
city: 'newyork'
},
}
只要把多个全局变量都整理在一个名称空间下,你将显著降低与其他程序,组件或类库之间产生糟糕的相互影响的可能性,你的程序也变得更容易阅读。