一.console对象
1.console.log
方法支持以下占位符,不同格式的数据必须使用对应格式的占位符:
%s:字符串
%d:整数
%i:整数
%f:浮点数
%o:对象的链接
%c:CSS格式字符串
①%d
和 %i
实验
console.log('%d',10);
>>>10
console.log('%i',10);
>>>10
console.log('%d',010);
>>>8
console.log('%i',010);
>>>8
console.log('%d',0x10);
>>>16
console.log('%i',0x10);
>>>16
②%c
2.console.table
①复合型数据转为表格显式地条件是,必须拥有主键。对于数组来说,主键就是数字键。对于对象来说,主键就是它的最外层键。
3.console.count()
①count
方法用于计数,输出它被调用了多少次。
function greet(user){
console.count();
return 'hi ' + user;
}
greet('Gerg');
>>>
1
"hi Gerg"
greet('asan');
>>>
2
"hi asan"
greet('tuhao');
>>>
3
"hi tuhao"
②该方法可以接收一个字符串作为参数,作为标签,对执行次数进行分类:
function greet(user){
console.count(user);
return 'hi ' + user;
}
greet('Gerg');
>>>
Gerg: 1
"hi Gerg"
greet('asan');
>>>
asan: 1
"hi asan"
greet('Gerg');
>>>
Gerg: 2
"hi Gerg"
4.console.time()
,console.timeEnd()
①这两个方法用于计时,可以算出一个操作所花费的准确时间。
console.time('Array initialize');
var array = new Array(10000);
for(var i = array.length - 1; i >= 0; i--){
array[i] = new Object();
};
console.timeEnd('Array initialize');
>>>Array initialize: 3.449951171875ms
②time
方法表示计时开始,timeEnd
方法表示计时结束。它们的参数是计数器的名称。
二.Object对象
1.Object
作为构造函数使用时,可以接收一个参数。如果该参数是一个对象,则直接返回这个对象;如果是一个原始类型的值,则返回该值对应的包装对象。
var person = {
name: 'Gerg'
};
var obj = new Object(person);
obj === person;
>>>true
Object.prototype.toString.call(new Object('yyc'));
>>>"[object String]"
2.Object()
①Object
本身当做工具方法使用时,可以将任意值转为对象。
②如果参数是原始类型的值,Object
方法返回对应的包装对象的实例。
Object()
>>>{}
Object.prototype.toString.call(Object());
>>>"[object Object]"
Object(undefined);
>>>{}
Object.prototype.toString.call(Object(undefined));
>>>"[object Object]"
Object(null);
>>>{}
Object.prototype.toString.call(Object(null));
>>>"[object Object]"
Object(123);
>>>Number {[[PrimitiveValue]]: 123}
Object.prototype.toString.call(Object(123));
>>>"[object Number]"
Object('yyc');
>>>String {0: "y", 1: "y", 2: "c", length: 3, [[PrimitiveValue]]: "yyc"}
Object.prototype.toString.call(Object('yyc'));
>>>"[object String]"
Object(false);
>>>Boolean {[[PrimitiveValue]]: false}
Object.prototype.toString.call(Object(false));
>>>"[object Boolean]"
③如果Object
方法的参数是一个对象,它总是返回原对象。
var arr = [];
Object(arr);
>>>[]
Object(arr) === arr;
>>>true
var obj = {};
Object(obj);
>>>{}
Object(obj) === obj;
>>>true
var fn = function () {};
Object(fn);
>>>ƒ () {}
Object(fn) === fn;
>>>true
④利用这一点,可以写一个函数来判断一个变量是否为对象。
function isObject(value){
return value === Object(value);
}
isObject([]);
>>>true
isObject({});
>>>true
isObject(1);
>>>false
3.Object对象的静态方法
- 什么是静态方法?
部署在
Object
对象自身的方法。
3.1 Object.keys()
,Object.getOwnPropertyName()
①这两个方法很相似,一般用来遍历对象的属性。它们的参数都是一个对象,都返回一个数组,该数组的成员都是对象自身的(而不是继承的)所有属性名。
②那么它们有什么区别?
Object.keys
方法只返回可枚举的属性名。
Object.getOwnPropertyNames
方法还返回不可枚举的属性名。
var arr = ['Hello','World'];
Object.keys(arr);
>>>(2) ["0", "1"]
Object.getOwnPropertyNames(arr);
>>>(3) ["0", "1", "length"]
- 数组的
length
属性是不可枚举的属性,所以只出现在Object.getOwnPropertyNames
方法的返回结果中。
4.不同数据类型的Object.prototype.toString
方法返回值如下:
数值:返回
[object Number]
字符串:返回[object String]
布尔值:返回[object Boolean]
undefined
:返回[object Undefined]
null
:返回[object Null]
数组:返回[object Array]
arguments
对象:返回[object Arguments]
函数:返回[object Function]
Error
对象:返回[object Error]
Date
对象:返回[object Date]
RegExp
对象:返回[object RegExp]
其他对象:返回[object Object]
- 也就是说,
Object.prototype.toString
可以得到一个实例对象的构造函数
//实例对象123
Object.prototype.toString.call(123);
//构造函数Number
>>>"[object Number]"
- 利用这个特性,可以写一个比
typeof
运算符更加精确的函数
var type = function(o){
var s = Object.prototype.toString.call(o);
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
}
type({});
>>>"object"
三.对象
1.对象字面量形式和构造形式创建的对象的区别?
- 在对面字面量中你可以一次添加多个键/值对,但在构造形式中,你必须逐个添加属性。
2.
typeof null;
>>>"object"
原理是这样的:不同的对象在底层都以二进制表示,在
JavaScript
中二进制前三位都为0
的话就会被判断为object
类型,null
的二进制表示是全0
,自然前三位也是0
,因此执行typeof
时会返回"object"
3.字符串(基本类型):"yyc"
并不是一个对象,只是一个字面量,而且是一个不可变的值。如果想在这个字面量上执行一些操作,比如获取长度、访问某个字符等,那需要将其转换为String
对象。
var s = 'yyc';
s.length;
>>>3
s.indexOf('y');
>>>0
- 不对呀,我这都没转换
String
对象,怎么也可以执行呀?
这是因为必要时
JavaScript
引擎会自动把字符串字面量转换成一个String
对象。
4.访问对象的属性的两种方式:
var person = {
name: 'Gerg'
};
//属性访问
person.name;
>>>"Gerg"
//键访问
person['name'];
>>>"Gerg"
5.可计算属性名
①ES6
增加了可计算属性名,可以在对象字面量形式中使用[]
包裹一个表达式来当做属性名:
var prefix = 'foo';
var obj = {
[prefix + 'bar']: 'Hello',
[prefix + 'baz']: 'World'
};
obj['foobar'];
>>>"Hello"
obj['foobaz'];
>>>"World"