小试牛刀
首先给出一些公司的关于javascript
类型的笔试题和答案,如果自行看了以后有疑惑的可以好好的看下该文章
//类型转换相关问题
var bar=true;
console.log(bar+0);
console.log(bar+"xyz");
console.log(bar+true);
console.log(bar+false);
console.log('1'>bar);
console.log(1+'2'+false);
console.log('2' + ['koala',1]);
var obj1 = {
a:1,
b:2
}
console.log('2'+obj1);
var obj2 = {
toString:function(){
return 'a'
}
}
console.log('2'+obj2)
//输出结果 1 truexyz 2 1 false 12false 2koala,1 2[object Object] 2a
//作用域和NaN 这里不具体讲作用域,意在说明NaN
var b=1;
function outer(){
var b=2;
function inner(){
b++;
console.log(b);
var b=3;
}
inner();
}
outer();
//输出结果 NaN
JavaScript
中的数据类型初步介绍
JavaScript
中共有七种内置数据类型,包括基本类型和对象类型。
- 基本类型:
- string(字符串)
- boolean(布尔值)
- number(数字)
- symbol(符号)
- null(空值)
- undefined(未定义)
注意:
string 、number 、boolean
和null undefined
这五种类型统称为原始类型(Primitive
),表示不能再细分下去的基本类型;
symbol
是ES6
中新增的数据类型,symbol
表示独一无二的值,通过Symbol
函数调用生成,由于生成的symbol
值为原始类型,所以Symbol
函数不能使用new
调用;
null
和undefined
通常被认为是特殊值,这两种类型的值唯一,就是其本身。
- 对象类型
对象类型也叫引用类型,array
和function
是对象的子类型。对象在逻辑上是属性的无序集合,是存放各种值的容器。对象值存储的是引用地址,所以和基本类型值不可变的特性不同,对象值是可变的。
js
是弱类型语言
JavaScript
是弱类型语言,而且JavaScript
声明变量的时候并没有预先确定的类型,变量的类型就是其值的类型,也就是说**变量当前的类型由其值所决定,**夸张点说上一秒种的String
,下一秒可能就是个Number
类型了,这个过程可能就进行了某些操作发生了强制类型转换。虽然弱类型的这种不需要预先确定类型的特性给我们带来了便利,同时也会给我们带来困扰,为了能充分利用该特性就必须掌握类型转换的原理。
js
中的强制转换规则
ToPrimitive
(转换为原始值)
ToPrimitive
对原始类型不发生转换处理,只针对引用类型(object
)的,其目的是将引用类型(object
)转换为非对象类型,也就是原始类型。
ToPrimitive
运算符接受一个值,和一个可选的期望类型作参数。ToPrimitive
运算符将值转换为非对象类型,如果对象有能力被转换为不止一种原语类型,可以使用可选的期望类型
来暗示那个类型。
转换后的结果原始类型是由期望类型决定的,期望类型其实就是我们传递的type
。直接看下面比较清楚。
ToPrimitive
方法大概长这么个样子具体如下。
/**
* @obj 需要转换的对象
* @type 期望转换为的原始数据类型,可选
*/
ToPrimitive(obj,type)
type不同值的说明
-
type
为string
: 转换过程为
1 先调用obj
的toString
方法,如果为原始值,则return
,否则进行第2步
2 调用obj
的valueOf
方法,如果为原始值,则return
,否则进行第3步
3 抛出TypeError
异常 -
type为number:
1 先调用obj
的valueOf
方法,如果为原始值,则return
,否则进行第2步
2 调用obj
的toString
方法,如果为原始值,则return
,否则第3步
3 抛出TypeError
异常 -
type
参数为空
1 该对象为Date
,则type
被设置为String
2 否则,type
被设置为Number
Date
数据类型特殊说明:
对于Date
数据类型,我们更多期望获得的是其转为时间后的字符串,而非毫秒值(时间戳),如果为number
,则会取到对应的毫秒值,显然字符串使用更多。其他类型对象按照取值的类型操作即可。
ToPrimitive
总结
ToPrimitive
转成何种原始类型,取决于type,type
参数可选,若指定,则按照指定类型转换,若不指定,默认根据实用情况分两种情况,Date为string
,其余对象为number
。那么什么时候会指定type
类型呢,那就要看下面两种转换方式了。 -
toString
:Object.prototype.toString()
该方法返回一个表示该对象的字符串。
每个对象都有一个toString()
方法,当对象被表示为文本值时或者当以期望字符串的方式引用对象时,该方法被自动调用。
这里先记住,
valueOf()
和toString()
在特定的场合下会自行调用。
valueOf
:Object.prototype.valueOf()
方法返回指定对象的原始值
JavaScript
调用valueOf()
方法用来把对象转换成原始类型的值(数值、字符串和布尔值)。但是我们很少需要自己调用此函数,valueOf
方法一般都会被JavaScript
自动调用。
不同内置对象的valueOf
实现:-
String
=> 返回字符串值
-