JavaScript数据类型详解

本文深入探讨JavaScript的数据类型,包括基本类型和对象类型,重点解析其弱类型特性和转换规则。从`typeof`、`toString`、`valueOf`和`instanceof`等角度分析数据类型判断,并揭示常见误区,如`NaN`的特性与`toString()`方法的差异。
摘要由CSDN通过智能技术生成

小试牛刀

首先给出一些公司的关于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 、booleannull undefined 这五种类型统称为原始类型(Primitive),表示不能再细分下去的基本类型;
symbolES6中新增的数据类型,symbol 表示独一无二的值,通过 Symbol函数调用生成,由于生成的 symbol值为原始类型,所以 Symbol 函数不能使用new调用
nullundefined通常被认为是特殊值,这两种类型的值唯一,就是其本身

  • 对象类型
    对象类型也叫引用类型arrayfunction是对象的子类型。对象在逻辑上是属性的无序集合,是存放各种值的容器。对象值存储的是引用地址,所以和基本类型值不可变的特性不同,对象值是可变的。

js是弱类型语言

JavaScript是弱类型语言,而且JavaScript 声明变量的时候并没有预先确定的类型,变量的类型就是其值的类型,也就是说**变量当前的类型由其值所决定,**夸张点说上一秒种的String,下一秒可能就是个Number类型了,这个过程可能就进行了某些操作发生了强制类型转换。虽然弱类型的这种不需要预先确定类型的特性给我们带来了便利,同时也会给我们带来困扰,为了能充分利用该特性就必须掌握类型转换的原理。

js中的强制转换规则

  • ToPrimitive(转换为原始值)
    ToPrimitive对原始类型不发生转换处理,只针对引用类型(object)的,其目的是将引用类型(object)转换为非对象类型,也就是原始类型。
    ToPrimitive 运算符接受一个值,和一个可选的期望类型作参数ToPrimitive运算符将值转换为非对象类型,如果对象有能力被转换为不止一种原语类型,可以使用可选的 期望类型来暗示那个类型。
    转换后的结果原始类型是由期望类型决定的,期望类型其实就是我们传递的type。直接看下面比较清楚。
    ToPrimitive方法大概长这么个样子具体如下。
/**
* @obj 需要转换的对象
* @type 期望转换为的原始数据类型,可选
*/
ToPrimitive(obj,type)

type不同值的说明

  • typestring: 转换过程为
    1 先调用objtoString方法,如果为原始值,则return,否则进行第2步
    2 调用objvalueOf方法,如果为原始值,则return,否则进行第3步
    3 抛出TypeError异常

  • type为number:
    1 先调用objvalueOf方法,如果为原始值,则return,否则进行第2步
    2 调用objtoString方法,如果为原始值,则return,否则第3步
    3 抛出TypeError 异常

  • type参数为空
    1 该对象为Date,则type被设置为String
    2 否则,type被设置为Number
    Date数据类型特殊说明:
    对于Date数据类型,我们更多期望获得的是其转为时间后的字符串,而非毫秒值(时间戳),如果为number,则会取到对应的毫秒值,显然字符串使用更多。其他类型对象按照取值的类型操作即可。
    ToPrimitive总结
    ToPrimitive转成何种原始类型,取决于type,type参数可选,若指定,则按照指定类型转换,若不指定,默认根据实用情况分两种情况,Date为string,其余对象为number。那么什么时候会指定type类型呢,那就要看下面两种转换方式了。

  • toStringObject.prototype.toString()该方法返回一个表示该对象的字符串。
    每个对象都有一个 toString() 方法,当对象被表示为文本值时或者当以期望字符串的方式引用对象时,该方法被自动调用

这里先记住,valueOf()toString()在特定的场合下会自行调用。

  • valueOfObject.prototype.valueOf()方法返回指定对象的原始值
    JavaScript调用 valueOf() 方法用来把对象转换成原始类型的值(数值、字符串和布尔值)。但是我们很少需要自己调用此函数,valueOf 方法一般都会被JavaScript 自动调用。
    不同内置对象的valueOf实现:
    • String => 返回字符串值
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值