在js里,一切皆为或者皆可以被用作对象。可通过new一个对象或者直接以字面量形式创建变量(如var i=”aaa”),所有变量都有对象的性质。注意:通过字面量创建的对象在调用属性和方法时会被对象包装器暂时包装成一个对象,具有对象的性质。如
var str="我不是一个真的对象";
//str被暂时包装成一个String对象,可调用该对象的属性和方法
alert(str.length);
不过这并不意味着它就是一个对象了,typeof(i)的值为仍String。
而通过new的对象,如
var str=new String("aaa");
typeof("str")==Object; //true
constructor
prototype
1、toString()
功能:返回当前对象的字符串形式,返回值为String类型。
[1,'2',true].toString(); //"1,2,true"
(new Date()).toString(); //"Sun Sep 24 2017 14:52:20 GMT+0800 (CST)"
({name:'ryan'}).toString(); //"[object Object]"
该方法属于Object对象,由于所有的对象都”继承”了Object的对象实例,因此几乎所有的实例对象都可以使用该方法。
JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。
2、toLocaleString
功能:返回当前对象的”本地化”字符串形式,以便于当前环境的用户辨识和使用,返回值为String类型。
(1234567).toLocaleString(); //"1,234,567"
(6.37588).toLocaleString(); //"6.376"
(new Date()).toLocaleString(); //"2017/9/24 下午2:58:21"
3、valueOf()
功能:返回指定对象的原始值。
JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。
1、Object.assign(target, …sources)
功能:把一个或多个源对象的可枚举、自有属性值复制到目标对象中,返回值为目标对象。
参数:
var target = {
a:1
};
var source1 = {
b:2
};
var source2 = {
c:function(){
console.log('c');
}
};
Object.assign(target,source1,source2);
console.log(target); //{a: 1, b: 2, c: ƒ}
2、Object.create(proto [,propertiesObject])
功能:创建一个对象,其原型为prototype,同时可添加多个属性。
参数:
propertiesObject参数详解:
function Person(name){
this.name = name;
}
Person.prototype.say = function(){console.log('my name is ' + this.name +',my age is ' + this.age);}
var person = new Person('ryan');
var p = Object.create(person,{
age:{
value: 23,
writable: true,
configurable: true
},
sex:{
configurable: true,
get:function(){return sex + '士';},
set:function(value){sex = value;}
}
});
p.sex = '男';
p.say(); //'my name is ryan,my age is 23'
console.log(p.sex); //'男士'
p.sex = '女';
console.log(p.sex); //'女士'
总结:Object.create(proto [,propertiesObject]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不是一个子函数,可以传一个null,第二个可选参数是对象的属性描述符。
3、Object.defineProperty(obj, prop, descriptor)
功能:在一个对象上定义一个新属性或修改一个现有属性,并返回该对象。
参数:
var obj = {};
Object.defineProperty(obj,'name',{
writable: true,
configurable: true,
enumerable: false,
value: '张三'
});
console.log(obj.name); //'张三'
for(var key in obj){
console.log(obj[key]); //无结果
}
总结:在参数 descriptor中,如果不指定configurable, writable, enumerable ,则这些属性默认值为false,如果不指定value, get, set,则这些属性默认值为undefined。
4、Object.defineProperties(obj, props)
功能:在一个对象上定义一个或多个新属性或修改现有属性,并返回该对象。
参数:
var obj = {};
Object.defineProperties(obj,{
name:{
writable: true,
configurable: true,
enumerable: false,
value: '张三'
},
age:{
writable: true,
configurable: true,
enumerable: true,
value: 23
}
});
console.log(obj.name); //'张三'
console.log(obj.age); //23
for(var key in obj){
console.log(obj[key]); //23
}
5、Object.seal(obj) / Object.isSealed(obj)
功能:密封对象,阻止其修改现有属性的配置特性,即将对象的所有属性的configurable特性设置为false(也就是全部属性都无法重新配置,唯独可以把writable的值由true改为false,即冻结属性),并阻止添加新属性,返回该对象。
var obj = {name:'张三'};
Object.seal(obj);
console.log(Object.isSealed(obj)); //true
obj.name = '李四'; //修改值成功
console.log(obj.name); //'李四'
obj.age = 23; //无法添加新属性
console.log(obj.age); //undefined
Object.defineProperty(obj,'name',{
writable: true,
configurable: true,
enumerable: true
}); //报错:Cannot redefine property: name
6、Object.freeze(obj) / Object.isFrozen(obj)
功能:完全冻结对象,在seal的基础上,属性值也不可以修改,即每个属性的wirtable也被设为false。
var obj = {name:'张三'};
Object.freeze(obj);
console.log(Object.isFrozen(obj)); //true
obj.name = '李四'; //修改值失败
console.log(obj.name); //'张三'
obj.age = 23; //无法添加新属性
console.log(obj.age); //undefined
Object.defineProperty(obj,'name',{
writable: true,
configurable: true,
enumerable: true
}); //报错:Cannot redefine property: name
补充:Object.isFrozen(obj)用于判断目标对象是否被冻结,返回布尔值。
7、getOwnPropertyDescriptor(obj, prop)
功能:获取目标对象上某自有属性的配置特性(属性描述符),返回值为配置对象。
参数:
var obj = {};
Object.defineProperty(obj,'name',{
writable: true,
configurable: false,
enumerable: true,
value: '张三'
});
var prop = Object.getOwnPropertyDescriptor(obj,'name');
console.log(prop); //{value: "张三", writable: true, enumerable: true, configurable: false}
8、Object.getOwnPropertyNames(obj)
功能:获取目标对象上的全部自有属性名(包括不可枚举属性)组成的数组。
var obj = {};
obj.say = function(){};
Object.defineProperties(obj,{
name:{
writable: true,
configurable: true,
enumerable: true,
value: '张三'
},
age:{
writable: true,
configurable: true,
enumerable: false,
value: 23
}
});
var arr = Object.getOwnPropertyNames(obj);
console.log(arr); //["say", "name", "age"]
9、Object.getPrototypeOf(obj)
功能:获取指定对象的原型,即目标对象的prototype属性的值。
function Person(name){
this.name = name;
}
var person = new Person('张三');
var p = Object.create(person); //对象p的原型为person
console.log(p); //Person {}
var __ptoto__ = Object.getPrototypeOf(p);
console.log(__ptoto__); //Person {name: "张三"}
10、Object.setPrototypeOf(obj, proto)
功能:设置目标对象的原型为另一个对象或null,返回该目标对象。
参数:
var obj = {a:1};
var proto = {};
Object.setPrototypeOf(obj,proto); //设置obj对象的原型
proto.b = 2; //为该原型对象添加属性
proto.c = 3;
console.log(obj.a); //1
console.log(obj.b); //2
console.log(obj.c); //3
解析:上述代码将proto对象设为obj对象的原型,所以从obj对象上可以顺利读取到proto 对象的属性,也就是原型链上的属性。
Object.setPrototypeOf()方法的作用与proto相同,用来设置当前对象的原型指向的对象(prototype)。它是 ES6 正式推荐的设置原型对象的方法。
11、Object.keys(obj)
功能:获取目标对象上所有可枚举属性组成的数组。
var person = {
type:'person',
say:function(){}
};
//以person对象为原型,创建obj对象
var obj = Object.create(person,{
sex:{
writable: true,
configurable: true,
enumerable: false, //设置sex属性为不可枚举
value: 'male'
},
age:{
writable: true,
configurable: true,
enumerable: true, //设置age属性为可枚举
value: 23
}
});
obj.name = '张三'; //自定义属性name默认为可枚举
console.log(obj.propertyIsEnumerable('name')); //true,成功验证name属性为可枚举
//用for-in可获取obj上全部可枚举的属性(包括自有和原型链上的)
var arr = [];
for(var key in obj){
arr.push(key);
}
console.log(arr); //["age", "name", "type", "say"]
//用Object.keys()可获取obj上全部可枚举的自有属性
console.log(Object.keys(obj)); // ["age", "name"]
总结:Object.keys(obj)方法获取的集合和for-in遍历获取的不同在于,Object.keys()只获取目标对象上可枚举的自有属性,而for-in遍历会包含原型链上可枚举属性一并获取。
Object.keys()和Object.getOwnPropertyNames()的相同之处都是获取目标对象的自有属性,区别在于,后者会连同不可枚举的自有属性也一并获取组成数组并返回。
12、Object.preventExtensions(obj) / Object.isExtensible(obj)
功能:使某一对象不可扩展,也就是不能为其添加新属性。
补充:Object.isExtensible(obj)方法用于判断一个对象是否可扩展,即是否可以添加新属性。
var obj = {
name: '张三'
};
Object.preventExtensions(obj); //阻止obj的可扩展性
console.log(Object.isExtensible(obj)); //false,表明obj对象为不可扩展,即阻止成功
obj.age = 23; //默认添加失败
console.log(obj.age); //undefined
1、length
设置或返回数组中元素的数目。
设置 length 属性可改变数组的大小。如果设置的值比其当前值小,数组将被截断,其尾部的元素将丢失。如果设置的值比它的当前值大,数组将增大,新的元素被添加到数组的尾部,它们的值为 undefined。
2、constructor
返回对创建此对象的数组函数的引用。
3、prototype
使您有能力向对象添加属性和方法。
1、concat()
2、join()
3、push()
4、pop()
5、shift()
6、unshift()
7、reverse()
8、sort()
9、slice(start [,end])
10、splice(index,howmany [,item1,item2…])
map():返回一个新的Array,每个元素为调用func的结果
filter():返回一个符合func条件的元素数组
some():返回一个boolean,判断是否有元素是否符合func条件
every():返回一个boolean,判断每个元素是否符合func条件
forEach():没有返回值,只是针对每个元素调用func
reduce():reduce方法有两个参数,第一个参数是一个callback,用于针对数组项的操作;第二个参数则是传入的初始值,这个初始值用于单个数组项的操作。需要注意的是,reduce方法返回值并不是数组,而是形如初始值的经过叠加处理后的操作。
Date对象:封装一个时间点,提供操作时间的API。Date对象中封装的是从1970年1月1日0点至今的毫秒数。
var now = new Date(); //获取客户端的当前系统时间
var date - new Date("1994/02/04 03:23:55"); //创建自定义时间
var date = new Date(yyyy, MM, dd, hh, mm, ss); //创建自定义时间
var oldDate = new Date("1994/02/04");
var newDate = new Date(oldDate); //复制一个时间对象
日期分量:FullYear、Month、Date、Day、Hours、Minutes、Seconds、Milliseconds。
每一个日期分量都有一个get和set方法(除了Day没有set方法),分别用于获取和设置时间对象。
日期的单位及范围:
1、global
2、ignoreCase
3、lastIndex
1、compile()
2、exec()
3、test()
1、arguments
function say(a,b,c){
console.log(arguments.length); //2
console.log(arguments[0],arguments[1]); //hello world
}
say('hello','world');
1、toString()
功能:将函数体转换成对应的字符串。
常用方法:
1、toString()
功能:根据布尔值返回字符串 “true” 或 “false”。
注释:在 Boolean 对象被用于字符串环境中时,此方法会被自动调用。
2、valueOf()
功能:返回 Boolean 对象的原始值。
1、toString()
功能:将Number数值转换为字符串,该方法接受一个可选参数基数,若省略该参数,则默认基数为10,即十进制。
var num = 10;
console.log(num.toString(2)); //1010
2、toLocaleString()
功能:把一个 Number 对象转换为本地格式的字符串。
3、valueOf()
功能:返回一个 Number 对象的基本数字值。
valueOf() 方法通常由 JavaScript 在后台自动进行调用,而不是显式地处于代码中。
1、length
功能:String 对象的 length 属性声明了该字符串中的字符数。
1、charAt()
2、charCodeAt()
3、indexOf()
4、lastIndexOf()
5、match()
如果 regexp 没有标志 g,那么 match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。除了这些常规的数组元素之外,返回的数组还含有两个对象属性。index 属性声明的是匹配文本的起始字符在 stringObject 中的位置,input 属性声明的是对 stringObject 的引用。
如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。
示例:
var s = 'hello21 world21';
console.log(s.match(/\d{2}/)); //[ '21', index: 5, input: 'hello21 world21' ]
var s = 'hello21 world21';
console.log(s.match(/\d{2}/g)); //[ '21', '21' ]
6、replace()
示例:
var s = 'hello world hello';
console.log(s.replace('hello','hi')); //hi world hello
console.log(s.replace(/hello/,'hi')); //hi world hello
console.log(s.replace(/hello/g,'hi')); //hi world hi
replace方法返回一个新字符串,并不会修改原字符串。
7、search()
示例:
var s = 'hello world hello';
console.log(s.search('hello')); //0
console.log(s.search(/hello/g)); //0
console.log(s.search(/hello2/)); //-1
search()方法不执行全局匹配,它将忽略标志 g。也就是说,它只匹配一次。若没匹配到结果,则返回-1。
8、toLowerCase() & toUpperCase()
示例:
var s = 'Hello World';
console.log(s.toLowerCase()); //hello world
console.log(s.toUpperCase()); //HELLO WORLD
9、concat()
concat方法不会修改原字符串。
stringObject.concat() 与 Array.concat() 很相似。
通常使用 “ + “ 运算符来进行字符串的连接运算通常会更简便一些。
示例:
var s1 = 'hello ';
var s2 = 'world ';
var s3 = '233';
console.log(s1.concat(s2,s3)); //hello world 233
10、split()
示例:
var s = 'hi baby';
console.log(s.split('')); //[ 'h', 'i', ' ', 'b', 'a', 'b', 'y' ]
console.log(s.split(' ')); //[ 'hi', 'baby' ]
console.log(s.split('b')); //[ 'hi ', 'a', 'y' ]
11、slice()
注意:String.slice() 与 Array.slice() 相似。
slice方法的两个参数接受负值,若为负数,则该参数规定的是从字符串的尾部开始算起的位置。也就是说,-1 指字符串的最后一个字符,-2 指倒数第二个字符,以此类推。
若未指定第二个参数,则默认截取至字符串的末尾。
slice方法不修改原字符串。
示例:
var s = 'hi baby';
console.log(s.slice(3)); //baby
console.log(s.slice(1,5)); //i ba
console.log(s.slice(-4)); //baby
console.log(s.slice(-4,-2)); //ba
12、substr()
注意:ECMAscript 没有对该方法进行标准化,因此不建议使用它。
示例:
var s = 'hi baby';
console.log(s.substr(3)); //baby
console.log(s.substr(3,2)); //ba
console.log(s.substr(-3,2)); //ab
13、substring()
示例:
var s = 'hi baby';
console.log(s.substring(3)); //baby
console.log(s.substring(3,5)); //ba
console.log(s.substring(5,3)); //ba
console.log(s.substring(3,3)); //''
注意:与 slice() 和 substr() 方法不同的是,substring() 不接受负的参数。
如果参数 start 与 stop 相等,那么该方法返回的一个空串。
如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。
关于全局对象:全局对象只是一个对象,而不是类。既没有构造函数,也无法实例化一个新的全局对象。
Infinity
代表正的无穷大的数值。
console.log(6/0); //Infinity
console.log(-6/0); //-Infinity
console.log(0/0); //NaN
console.log(1.7976931348623157E+10308); //Infinity
console.log(-1.7976931348623157E+10308); //-Infinity
Infinity代表了超出JavaScript处理范围的数值。也就是说JS无法处理的数值都是Infinity。实践证明,JS所能处理的最大值是1.7976931348623157e+308,而最小值是5e-324。
NaN
代表非数字的值。
var a = Number('100');
var b = Number('hello world');
console.log(a); //100
console.log(b); //NaN
console.log(isNaN(a)); //false
console.log(isNaN(b)); //true
提示:请使用 isNaN() 方法来判断一个值是否是数字,原因是 NaN 与所有值都不相等,包括它自己。
Undefined
代表未定义的值。
var a;
var b = '';
var c = null;
console.log(a === undefined); //true
console.log(b === undefined); //false
console.log(c == undefined); //true
提示:判断一个变量是否未定义,只能用 === undefined 运算来测试,因为 == 运算符会认为 undefined 值等价于 null,即undefined == null会返回true。
注释:null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。
1、encodeURI(URIString)
console.log(encodeURI('http://www.baidu.com')); //http://www.baidu.com
console.log(encodeURI('http://www.baidu.com/my mind')); //http://www.baidu.com/my%20mind
console.log(encodeURI(',/?:@&=+$#')); //,/?:@&=+$#
2、encodeURIComponent(URIString)
功能:将字符串作为URI组件进行编码,返回值为URIstring的副本。
该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ‘ ( ) 。
其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
参数:URIString(必须):一个待编码的字符串。
3、parseInt(string,radix)
功能:解析一个字符串,并返回一个整数。
参数:
console.log(parseInt('10')); //10
console.log(parseInt('11',9)); //10 (9+1)
console.log(parseInt('11',2)); //3 (2+1)
console.log(parseInt('17',8)); //15 (8+7)
console.log(parseInt('1f',16)); //31 (16+15)
console.log(parseInt('010')); //10
console.log(parseInt('0x0011')); //17
4、parseFloat()
功能:解析一个字符串,并返回一个浮点数。
该函数指定字符串中的首个字符是否是数字。如果是,则对字符串进行解析,直到到达数字的末端为止。
参数:string(必须):待解析的字符串
console.log(parseFloat('10')); //10
console.log(parseFloat('10.00')); //10
console.log(parseFloat('10.33')); //10.33
console.log(parseFloat(' 60 ')); //60 首尾的空格会忽略
console.log(parseFloat('23 34 45')); //23 中间的空格不会忽略,会中断
console.log(parseFloat('23 years')); //23
console.log(parseFloat('i am 23')); //NaN
5、isFinite(number)
功能:用于检查其参数是否是无穷大。
参数:
number(必须):待检测数字。
如果 number 是有限数字(或可转换为有限数字),那么返回 true。否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。
console.log(isFinite(123)); //true
console.log(isFinite(-1.23)); //true
console.log(isFinite(5-2)); //true
console.log(isFinite(0)); //true
console.log(isFinite(0/0)); //false
console.log(isFinite('Hello')); //false
6、isNaN(number)
功能:用于检查其参数是否为非数字值。
参数:
number(必须):待检测数字。
如果 number 是非数字值 NaN(或者能被转换成NaN),返回 true,否则返回 false。
console.log(isNaN(123)); //false
console.log(isNaN(-1.23)); //false
console.log(isNaN(5-2)); //false
console.log(isNaN(0)); //false
console.log(isNaN(0/0)); //true
console.log(isNaN('Hello')); //true
7、Number(object)
功能:把对象的值转换为数字。
参数:
object(必须):待转换的对象。
如果参数是 Date 对象,Number() 返回从1970年1月1日至今的毫秒数,即时间戳。如果对象的值无法转换为数字,那么 Number() 函数返回 NaN。
console.log(Number(new Boolean(true))); //1
console.log(Number(new Boolean(false))); //0
console.log(Number(new Date())); //1506266494726
console.log(Number(new String('999'))); //999
console.log(Number(new String('999 888'))); //NaN
8、String(object)
功能:把对象的值转换为字符串。
参数:object(必须):待转换的对象。
console.log(String(new Boolean(true))); //'true'
console.log(String(new Boolean(false))); //'false'
console.log(String(new Date())); //'Sun Sep 24 2017 23:25:43 GMT+0800 (CST)'
console.log(String(new String('999'))); //'999'
console.log(String(new String('999 888'))); //'999 888'
console.log(String(12345)); //'12345'
Math.abs();
//取绝对值Math.ceil();
//向上取整Math.floor();
//向下取整Math.round();
//四舍五入取整Math.random();
//生成0~1间的随机数(>0)Math.max(x,y);
//取x、y中较大的那个Math.min(x,y);
//取x、y中较小的那个我们常说的对象字面量其实不是JSON对象,但是有真正的JSON对象。
两者完全不一样概念,在新版的浏览器里JSON对象已经被原生的内置对象了,目前有2个静态方法:JSON.parse用来将JSON字符串反序列化成对象,JSON.stringify用来将对象序列化成JSON字符串。
老版本的浏览器不支持这个对象,但你可以通过json2.js来实现同样的功能。
1、JSON.parse()
var jsonString = '{"name":"ryan"}'; //JSON字符串(比如从AJAX获取字符串信息)
var obj = JSON.parse(jsonString); //将字符串反序列化成对象
console.log(obj); //{ name: 'ryan' }
console.log(obj.name == 'ryan'); //true
2、JSON.stringify()
var obj = {name:'ryan',age:23};
var jsonString = JSON.stringify(obj);
console.log(jsonString); //'{"name":"ryan","age":23}'