js数据类型


js数据类型


七大类型

js一共有七个数据类型,在谷歌67版本中还出现了一种 bigInt。是指安全存储、操作大整数。但是大部分人都不把这个当作一个类型

  • 数值(number):整数和小数(比如1和3.14)
  • 字符串(string):文本(比如’Hello World’)。
  • 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)
  • undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
  • null:表示空值,即此处的值为空 。
  • 对象(object):各种值组成的集合,对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。
  • symbol (symbol ) : 唯一标识符

数值,字符串,布尔值这三种类型合称为原始类型(primitive type)的值,既是他们最基本的数据类型,不可再细分。
对象则称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
至于undefined和null,一般将它们看成两个特殊值。

基础类型&引用类型

基础类型存储在栈内存中
Undefined、Null、Boolean、Number、String和symbol
引用数据类型在栈堆中
图一

类型判断

JavaScript 有三种方法,可以确定一个值到底是什么类型。

  • typeof运算符
  • instanceof运算符
  • Object.prototype.toString方法

typeof

    typeof 123 // "number"
    typeof '123' // "string"
    typeof false // "boolean"
    typeof undefined //"undefined"
    typeof null // "object"

instanceof
instanceof运算符用于检测构造函数的 prototype属性是否出现在某个实例对象的原型链上。
使用typeof[]{}都会返回object

typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'

显然采用typeof判断对象类型不太合适,采用instanceof会好一点,instanceof只用用于对象的判断,基元类型使用instanceof返回false

var a = 123
var b = '123'
var c = [1,2,3]
var d = {a:1}
var e = new String('e')
a instanceof Number // false
b instanceof String // false
c instanceof Array // true
d instanceof Object // true
e instanceof String // true

Object.prototype.toString
可以通过 toString() 来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,传递要检查的对象作为第一个参数,称为 thisArg

console.log(Object.prototype.toString.call([])) // [object Array]
console.log(Object.prototype.toString.call({})) // [object Object]
console.log(Object.prototype.toString.call(true))// [object Boolean]
console.log(Object.prototype.toString.call(null))// [object Null]
console.log(Object.prototype.toString.call(undefined))// [object Undefined]
console.log(Object.prototype.toString.call('11'))// [object String]
console.log(Object.prototype.toString.call(11))// [object Number]
console.log(Object.prototype.toString.call(function () { }))// [object Function]

isNaN
isNaN方法可以用来判断值是否为NaN,且只对数值有效,如果输入其他值,会被先转成数值。
列子:

isNaN('Hello') // true
// 相当于
isNaN(Number('Hello')) // true

传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaNtrue的值,有可能不是NaN,而是一个字符串。

isNaN({}) // true
// 等同于
isNaN(Number({})) // true

isNaN(['xzy']) // true
// 等同于
isNaN(Number(['xzy'])) // true

出于同样的原因,对于对象和数组,isNaN也返回true
但是对于空数组和只有一个数值成员的数组,isNaN返回false,因为这些数组能被Number函数转成数值。

isNaN([]) // false
isNaN([123]) // false
isNaN(['123']) // false

因此,使用isNaN之前,最好判断一下数据类型。

function myIsNaN(value) {
  return typeof value === 'number' && isNaN(value);
}

判断NaN更可靠的方法是,利用NaN为唯一不等于自身的值的这个特点,进行判断。

function myIsNaN(value) {
  return value !== value;
}

isFinite
isFinite方法返回一个布尔值,表示某个值是否为正常的数值。

isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true

除了Infinity-InfinityNaNundefined这几个值会返回falseisFinite对于其他的数值都会返回true

数据类型转换

转换成字符串类型

  • toString()
      var num = 5;
      console.log(num.toString());
    
  • String()
        String(123)
        // String()函数存在的意义:有些值没有toString(),这个时候可以使用String()。比如:undefined和null
    
  • 拼接字符串方式
      num + ""
    
    当 + 两边一个操作符是字符串类型,一个操作符是其它类型的时候,会先把其它类型转换成字符串再进行字符串拼接,返回字符串

    转换成数值类型

  • Number(Obj)
    Number()可以把任意值转换成数值,如果要转换的字符串中有一个不是数值的字符,返回NaN
  • parseInt(string,radix)
    var num1 = parseInt("12.3abc");  // 返回12,如果第一个字符是数字会解析知道遇到非数字结束
    var num2 = parseInt("abc123");   // 返回NaN,如果第一个字符不是数字或者符号就返回NaN
    
  • +--0等运算
      var str = '500';
      console.log(+str);        // 取正
      console.log(-str);        // 取负
      console.log(str - 0);       // 500
    

    转换成布尔类型

  • Boolean()
  • !!
    ''(空字符串) null undefined NaN 0 会转换成false 其它都会转换成true

文章作者: Ziki
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ziki !
  目录