聊聊js中的typeof

内容:

1.typeof

2.值类型和引用类型

3.强制类型转换

typeof

官方文档:typeof

1.作用:

操作符返回一个字符串,指示未经计算的操作数的类型。

2.语法:

          typeof operand

参数:operand 是一个表达式,表示对象或原始值,其类型将被返回。

3.返回值:

类型结果
Undefined"undefined"
Null"object"(见下文)
Boolean"boolean"
Number"number"
String"string"
Symbol (ECMAScript 6 新增)"symbol"
宿主对象(由JS环境提供)Implementation-dependent
函数对象([[Call]] 在ECMA-262条款中实现了)"function"
任何其他对象"object"

4.示例:

 1 <!DOCTYPE html>
 2 <html>
 3 
 4 <head>
 5     <meta charset="utf-8">
 6     <title>typeof返回值有哪些类型</title>
 7     <script type="text/javascript">
 8     // Numbers
 9     console.log(typeof 37); //number
10     console.log(typeof Math.LN2); //number
11     console.log(typeof NaN); // number   尽管NaN是"Not-A-Number"的缩写
12     // Strings
13     console.log(typeof "bla"); // string
14     console.log(typeof ""); // string
15     console.log(typeof(typeof 1)); // string typeof总是返回一个字符串
16     // Booleans
17     console.log(typeof true); //boolean
18     // // Symbols
19     console.log(typeof Symbol()); //symbol
20     console.log(typeof Symbol('foo')); //symbol
21     // Undefined
22     console.log(typeof undefined); //undefined
23     // Objects
24     console.log(typeof { a: 1 }); //object
25     console.log(typeof null);     //object 从一开始出现JavaScript就是这样的
26     // 使用Array.isArray 或者 Object.prototype.toString.call
27     // 区分数组,普通对象
28     console.log(typeof [1, 2, 4]);           //object
29     console.log(typeof new Date());          //object
30     // 下面的容易令人迷惑,不要使用!
31     console.log(typeof new Boolean(true));   //object
32     console.log(typeof new Number(1));       //object
33     console.log(typeof new String("abc"));   //object
34     // 函数
35     console.log(typeof function() {});     //function
36     console.log(typeof class C {});        //function
37     console.log(typeof new Function());    //function
38     </script>
39 </head>
40 
41 <body>
42 </body>
43 
44 </html>

从上面的示例得出:

js中使用typeof能得到的类型有:undefined、string、number、boolean、object、function。

typeof只能区分值类型的详细类型,而对于引用类型就不行了。

看完typeof我们顺便来聊聊值类型和引用类型:

数据类型基本/引用类型
undefined基本类型
null基本类型
number基本类型
boolean基本类型
string基本类型
function引用类型
object引用类型

1.示例:

    var a=1,b=a;
    a=2;
    console.log('a:'+a);//a:2
    console.log('b:'+b);//b:1
    //上面,b获取值是a值的一份拷贝,虽然,两个变量的值是相等,但是两个变量保存两不同的基本数据类型值。b只是保存了a复制的一个副本。所以,当a的值改变时,b的值依然是1;
    var a={'age':20},b=a;
    a.age=22;
    console.log('a:'+JSON.stringify(a));//a:{"age":22}
    console.log('b:'+JSON.stringify(b));//b:{"age":22}
    b.age=11;
    console.log('a:'+JSON.stringify(a));//a:{"age":11}
    console.log('b:'+JSON.stringify(b));//b:{"age":11}
    // 我们声明了一个引用数据类型变量a,并把它赋值给了另外一个引用数据类型变量b。当我们任意改变a、b其中一个的age属性值时,a、b的age属性都会发生变化。说明这两个引用数据类型变量指向同一个堆内存对象。a赋值给b,实际只是把这个堆内存对象在栈内存的引用地址复制了一份给了b,但它们本质上共同指向了同一个堆内存对象。

学习:JavaScript 是传值调用还是传引用调用?

顺带说说强制类型转换

1.字符串拼接

    var a=100+10;
    console.log(a); //110
    var b=100+'10';
    console.log(b);//10010

2.==运算符

    console.log(100=='100');//true
    console.log(0=='');//true
    console.log(null==undefined);//true

3.if语句

    var c=true;
    if(c){
        console.log('is true');//执行
    }else {
        console.log('is false');
    }
    var d=100;
    if(d){
        console.log('is true');//执行
    }else {
        console.log('is false');
    }
    var d='';
    if(d){
        console.log('is true');
    }else {
        console.log('is false');//执行
    }

4.逻辑运算

    console.log(10&&0);//0
    console.log(''||'ab');//'ab'
    console.log(!window.abc);//true  window.abc  undefined  取反则为true
    //判断一个变量是 true还是false可以给其前面加  !!
    var a=100;
    console.log(!!a);//true 

以下内容来此:ECMAScript 类型转换

5.Boolean() 函数

当要转换的值是至少有一个字符的字符串、非 0 数字或对象时,Boolean() 函数将返回 true。如果该值是空字符串、数字 0、undefined 或 null,它将返回 false。

var b1 = Boolean("");        //false - 空字符串
var b2 = Boolean("hello");        //true - 非空字符串
var b1 = Boolean(50);        //true - 非零数字
var b1 = Boolean(null);        //false - null
var b1 = Boolean(0);        //false - 零
var b1 = Boolean(new object());    //true - 对象

6.Number() 函数

Number() 函数的强制类型转换与 parseInt() 和 parseFloat() 方法的处理方式相似,只是它转换的是整个值,而不是部分值。

还记得吗,parseInt() 和 parseFloat() 方法只转换第一个无效字符之前的字符串,因此 "1.2.3" 将分别被转换为 "1" 和 "1.2"。

用 Number() 进行强制类型转换,"1.2.3" 将返回 NaN,因为整个字符串值不能转换成数字。如果字符串值能被完整地转换,Number() 将判断是调用 parseInt() 方法还是 parseFloat() 方法。

下表说明了对不同的值调用 Number() 方法会发生的情况:

用法结果
Number(false)0
Number(true)1
Number(undefined)NaN
Number(null)0
Number("1.2")1.2
Number("12")12
Number("1.2.3")NaN
Number(new object())NaN
Number(50)50

7.String() 函数

最后一种强制类型转换方法 String() 是最简单的,因为它可把任何值转换成字符串。

要执行这种强制类型转换,只需要调用作为参数传递进来的值的 toString() 方法,即把 12 转换成 "12",把 true 转换成 "true",把 false 转换成 "false",以此类推。

强制转换成字符串和调用 toString() 方法的唯一不同之处在于,对 null 和 undefined 值强制类型转换可以生成字符串而不引发错误:

var s1 = String(null);    //"null"
var oNull = null;
var s2 = oNull.toString();    //会引发错误

 

转载于:https://www.cnblogs.com/yingzi1028/p/8119614.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值