js 类型

五大基本类型:undefined,null,String,Number,Boolean

其储存于栈内存中,永远保存,不可改。

变量改变的时候,是开辟新的内存空间去存储的;把旧的地址下标复原,但是数据还在。

 

原始类型:Undefined、Null、Boolean、Number、String
引用类型:Object(object,array)

只有一个唯一值的数据类型值分别是 undefined、null,从逻辑角度来看 null 值表示一个空对象指针,这也正是使用 typeof null 时返回 object 的原因;

而 undefined 是在ECMA第三版才引入,目的是为了正式区分空对象指针与未初始化(赋值)的变量。

 

typeof

typeof 对数组、对象、null 都会被判断为 object,其他判断都正确。
主要原因有以下三点:
1.可以从js早期设计,为了方便开发者编写简单的代码
2.弱类型(动态)语言
3.对象的通用性
因此这些因素共同导致了"typeof"操作符的设计,它在检测类型时并没有提供足够的精确性
  • 对于数组,JavaScript的设计者将它们视为一种特殊的对象,因此"typeof"返回"object"。
  • 对于对象字面量,它们本质上也是对象,因此返回"object"。
  • 对于null,虽然null是一种特殊的值,表示空引用,但在早期版本的JavaScript中,由于一个错误,"typeof null"也返回"object",这个错误一直保留到了今天。

typeof function(){} 返回了function;

这是因为Function本身就是Object的一个子类,只不过与普通对象相比,它在内部实现了一个[[call]]方法,用来表示该对象可以被调用,

typeof在判断一个对象时,如果对象内部包含了[[call]]方法,就会返回function。

也就是说function就是实实在在的对象。

 

instanceof
instanceof 可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型。

 基本数据类型在JavaScript中不具备原型链,所以为false

 

null == undefined--true

null === undefined--false

任何数据类型和 undefined 运算都是 NaN;

任何值和 null 运算,null 可看做 0 运算。

 

变量中加入字符串进行拼接,可以被同化为字符串。

var a = "1";
var b = 2;
console.log(a + b);

输出12

们知道,"2"+1得到的结果其实是字符串,但是"2"-1得到的结果却是数值1,这是因为计算机自动帮我们进行了“隐式转换”。

也就是说,-*/%这几个符号会自动进行隐式转换,会把操作数转换成数字的。例如:

var a = "4" + 3 - 6;
console.log(a);

输出37

 

['0', '1', '2'].map(parseInt) // [0, NaN, NaN]

可以看成

var arr = ["0","1","2"];
arr.map((value,index,array) => parseInt(value,index));
parseInt('0', 0); // 0 (parseInt的处理方式,这个地方item没有以"0x"或者"0X"开始,8和10这个基数由实现环境来定,ES5规定使用10来作为基数,因此这个0相当于传递了10)
parseInt('1', 1); // NaN (因为parseInt的定义,超出了radix的界限)
parseInt('2', 2); // NaN (虽然没有超出界限,但是二进制里面没有2,因此返回NaN)

parseInt(stringradix);

string: 需要转化的字符,如果不是字符串会被转换,忽视空格符。

radix:数字2-36之前的整型。默认使用10,表示十进制。这个参数的意义是指把前面的字符看作是多少进制的数字,所谓的基数。

 

Symbol具有两大特性:

1.避免常量值重复

const a = Symbol('a')
const b = Symbol('a')
a === b // false

2.避免对象属性覆盖(向下兼容)

function fn(o) { // {user: {id: xx, name: yy}}
  const s = Symbol()
  o[s] = 'zzz'
  ...
}

 

 

 

除了undefined,null,NaN,“”,0,false其他都为真;

NaN谁都不相等,即使是他本身也不相等;NaN!= NaN;

字符串作对比,如:>,<.是根据他的ASCII码去作比较的;

 

&&与||

1、&&:遇到真就往后走;直到遇到假或者走到最后就返回当前值;

1 && 1 返回1 真
0 && 1 返回0 假
1 && 0 返回0 假
0 && 0 返回0 假

2.||:遇到假就往后走;直到遇到真或者走到最后就返回当前值;

1 || 1 返回1 真
0 || 1 返回1 真
1 || 0 返回0 真
0 || 0 返回0 假

常用例子:var content=contnet||"window";

 

Number

var a='1a';
typeof(Number(a)) // number
Number(a)// NaN
typeof (typeof(Nnumber(a)))// string
Number(null) //0
Number(undefined) // NaN
Number(true) // 1
Number(false) // 0

typeof出来的类型名称,本质上是字符串;所以在typeof永远都显示string

 

paresInt

var a='3.99';
ParesInt(a)// 3
paresInt(null) // NaN
paresInt(undefined) // NaN
paresInt(true) // NaN
paresInt(false) // NaN
paresInt(NaN) // NaN
paresInt('123abc') // 123
paresInt('abc123') // NaN

 可以有两个参数,第一个参数为取整的数据;第二个为以什么进制转换成10进制的(2-36)位;

 

isNaN

isNaN('123') // false
isNaN(123) // false
isNaN(null) // false
isNaN(undefined) // true
isNaN('a') // true

isNaN里面的值 --> Number(值) --> NaN --> bool

 

Boolean

除了undefined null NaN " " 0 false 其他都是true 

 

posted on 2020-08-06 16:34  sss大辉  阅读(182)  评论(0编辑  收藏  举报

导航