Javascript的简单数据类型
1.数字number
JS不分整型和浮点型
两个浮点数相加,精度不够
2.字符串string
3.布尔值boolean
4.null
5.undefined
6.symbol
以上都是简单数据类型
其他都是对象 Function Array等
研究一下 前五个貌似是对象,因为他们拥有方法,但他们是不可变的?
数字、字符串、布尔值并不是对象,但是它们却拥有属性和方法。这是因为在引用它们的属性和方法时会分别通过调用new Number()、new String()、new Boolean()包装对象来转换成对象,该对象继承了对应的方法来处理属性的引用,一旦引用结束,便会销毁这个临时对象。null和undefined没有包装对象,访问它们的属性会报类型错误。
例:console.log(typeof 1); //number
console.log(typeof new Number(1)); //object
1===new Number(1) //fasle
这里把1包装成一个对象,这就是原始类型和包装对象的区别。
let x = 32;
console.log(x.toString(2)); //100000
方法和属性也可用于原始值,因为 JavaScript 在执行方法和属性时将原始值视作对象。
简单数据类型,不是对象
let num = 1;
console.log(typeof num); //number
let str = 'guo';
console.log(typeof str); //string
let q = true;
console.log(typeof q); //boolean
let w = null;
console.log(typeof w); //object
let e = undefined;
console.log(typeof e); //undefined
let r = Symbol('big');
console.log(typeof r); //symbol
console.log(num instanceof Object); //false
console.log(str instanceof Object); //false
console.log(q instanceof Object); //false
console.log(w instanceof Object); //false
console.log(e instanceof Object); //false
console.log(r instanceof Object); //false
显然,简单数据类型不是对象。
let strr = new String('guo');
console.log(strr instanceof Object); //true ‘字符串对象’
num.name = 'xiao';
console.log(num.name); //undefined
Object.prototype.last="原型链最末尾的";
console.log(num.last); //原型链最末尾的
console.log(str.last); //原型链最末尾的
console.log(q.last); //原型链最末尾的
console.log(w.last); //报错
console.log(e.last); //报错
console.log(r.last); //原型链最末尾的
简单数据类型不能添加属性,但是除了null和undefined,其他的都可以访问属性,所以他们拥有对象的特征,但其实还是简单数据类型而非对象。
JavaScript中的对象是可变的键控集合,除了简单类型外,其他的值都是对象。数组是对象,函数是对象,正则表达式是对象,对象也可以是对象。对象是无类别的且对新属性的名字和值没有约束。对象是属性的容器,每个属性都有key
和value
,key
的值可以是包括空字符串在内的任意字符串,value
的值是除undefined之外的任何值。
对象字面量
创建对象
var empty_object = {}; //创建一个空对象
var me = {
"firstname": "guo",
"lastname": "xiao",
name: "xiaoguo",
age: 19,
state: {
isSignle: true,
sex: "男"
}
}; //当属姓名是一个合法的JavaScript标识符且不是保留字时,不强制要求用引号括住属性名
me.state //{isSignle: true, sex: "男"}
me.state.sex //"男"
对象可嵌套,属性的值可以从包括另一个对象字面量在内的任一表达式中获得。
检索
console.log(me.state.sex); //nan
console.log(me["firstname"]); //guo
console.log(me.girlfriend); //undefined
var girl = me.girlfriend || "unappear";
console.log(me.girlfriend); //"unappear"
要检索对象里包含的值,可用以[ ]
表达式,若字符串是合法标识符而非保留字,则也可用.
调用,常规下,优先使用紧凑且可读性好的.
调用.若尝试检索不存在的成员属性值,则返回undefined。
利用运算符||
可以进行默认值填充,&&运算符可避免检索一个undefined值时报错。
更新
对象中的值可以通过赋值语句来更新。若属性名已经存在,那么这个属性会被覆盖掉。若属性名已经存在,那么这个属性会被覆盖掉。
me.sex = '女';
me.boyfriend = 'xaioguo';
me.sex //"女"
me.boyfriend //"xaioguo"
引用
对象可通过引用来传递,但它们永远不会被复制
var pickheart = me;
me.age = 20;
var onepiece = me;
console.log(pickheart.age); //20
console.log(pickheart.age); //20
a1,a2引用了不同的对象,因此也各不影响
var a1 = {},
a2 = {};
a1 == a2 //false
a1 === a2 //false
原型
每个对象都关联到一个原型对象,并可从中继承相应属性。所有通过对象字面量创建的对象都连接到 Object.prototype,它也是 JavaScript 中的终点对象。当创建一个新对象时,可以选择某个对象为其原型,可以尝试给 Object 添加一个 beget 方法,它可以创建一个使用原对象作为其原型的新对象。
var me = {
"firstname": "guo",
"lastname": "xiao",
name: "xiaoguo",
age: 19,
state: {
isSignle: true,
sex: "男"
}
};
if (typeof Object.beget !== 'function') {
Object.beget = function (o) {
var F = function () {};
F.prototype = o;
return new F();
}
}
var he = Object.beget(me);
console.log(he.name); //xaioguo
反射
检查并确定对象具有的属性,进行检索并验证即可,通常使用typeof
,但原型链的任何属性还会产生同一个值,
为了处理掉这些不需要的属性,可以利用hasOwnProperty方法
来检验是否是对象独有的属性,它将返回对应的布尔值,它不会检查原型链。
枚举
for (name in me) {
if (typeof me.name !== 'function') {
document.writeln(name + ':' + me.name);
}
}
for in 语句用来遍历对象中的所有属性名。该枚举过程会列出所有的属性(包括函数和原型链中的属性)同时一般利用 typeof 来排除不想要的函数。因为属性名的出现顺序是不确定的,若想确保特定顺序应完全避免for in 语句的使用,用for循环实现。
删除
delete运算符用来删除对象的属性,它会移除对象包含的属性,但不会对原型链产生影响。删除对象的属性,可能会让它原型链中的此属性浮现出来。
he.age = 19;
console.log(he.age); //19
delete he.age;
console.log(he.age); //20
减少全局变量污染
JavaScript
可以随意定义全局变量,但同时会削弱程序的灵活性。一般只为应用创建唯一一个全局变量容器,把全局资源都归纳至一个名称空间下,则会显著降低命名冲突,减少全局污染。