聊聊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.示例:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>typeof返回值有哪些类型</title>
- <script type="text/javascript">
- // Numbers
- console.log(typeof 37); //number
- console.log(typeof Math.LN2); //number
- console.log(typeof NaN); // number 尽管NaN是"Not-A-Number"的缩写
- // Strings
- console.log(typeof "bla"); // string
- console.log(typeof ""); // string
- console.log(typeof(typeof 1)); // string typeof总是返回一个字符串
- // Booleans
- console.log(typeof true); //boolean
- // // Symbols
- console.log(typeof Symbol()); //symbol
- console.log(typeof Symbol('foo')); //symbol
- // Undefined
- console.log(typeof undefined); //undefined
- // Objects
- console.log(typeof { a: 1 }); //object
- console.log(typeof null); //object 从一开始出现JavaScript就是这样的
- // 使用Array.isArray 或者 Object.prototype.toString.call
- // 区分数组,普通对象
- console.log(typeof [1, 2, 4]); //object
- console.log(typeof new Date()); //object
- // 下面的容易令人迷惑,不要使用!
- console.log(typeof new Boolean(true)); //object
- console.log(typeof new Number(1)); //object
- console.log(typeof new String("abc")); //object
- // 函数
- console.log(typeof function() {}); //function
- console.log(typeof class C {}); //function
- console.log(typeof new Function()); //function
- </script>
- </head>
- <body>
- </body>
- </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,但它们本质上共同指向了同一个堆内存对象。
顺带说说强制类型转换
1.字符串拼接
- var a=100+10;
- console.log(a); //
- var b=100+'10';
- console.log(b);//
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);//
- 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(); //会引发错误
聊聊js中的typeof的更多相关文章
- Ext JS中的typeOf
Ext JS中的typeOf:以字符串格式,返回给定变量的类型 其中对字符串对象.元素节点.文本节点.空白文本节点判断并不准确 测试代码如下: <!DOCTYPE HTML PUBLIC &qu ...
- 浅谈JS中的typeof和instanceof的区别
JS中的typeof和instanceof常用来判断一个变量是否为空,或者是什么类型. typeof typeof运算符返回一个用来表示表达式的数据类型的字符串. typeof一般返回以下几个字符串: ...
- js中的typeof name
js中的name 使用typeof name得到 string.. 因为name是全局变量,可以在任意浏览器中使用 . cosole.dir(window)查看.. console.log(type ...
- 咱们来聊聊JS中的异步,以及如何异步,菜鸟版
为什么需要异步?why?来看一段代码. 问题1: for(var i=0;i<100000;i++){ } alert('hello world!!!'); 这段代码的意思是执行100...次后 ...
- 一文搞懂js中的typeof用法
基础 typeof 运算符是 javascript 的基础知识点,尽管它存在一定的局限性(见下文),但在前端js的实际编码过程中,仍然是使用比较多的类型判断方式. 因此,掌握该运算符的特点,对于写出好 ...
- javascript js中的typeof使用
typeof运算符介 绍:typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型. 你 知道下面typeof运算的结果吗? typeof ...
- js中的typeof
typeof的几种返回结果的分类: 转自:http://www.360doc.com/content/14/0718/15/8790037_395279403.shtml typeof运算符介 绍:t ...
- js 中使用typeof
>typeof(null) <"object" 对null执行typeof预算,结果返回字符串'object',也就是说,可以将null认为是一个特殊的对象值,含义是“ ...
- js中的typeof和instanceof和===
typeof: 用于判断number/string/boolean/underfined类型/function 不能判断:null和object ,不能区分object和Array instanceo ...
随机推荐
- 二、VueJs 填坑日记之基础项目构建
在上一篇文章中,大致介绍了一下本系列博文以及学习vuejs我们需要了解的一些概念,希望大家认真阅读,所谓知己知彼,百战百胜,学习也一样,工欲善其事,必先利其器,要想学好vuejs,那前提的概念一定要熟 ...
- The Lisp Curse /Lisp魔咒
The Lisp Curse /Lisp魔咒 http://winestockwebdesign.com/Essays/Lisp_Curse.html 英文出处 http://www.soimort. ...
- C#三步实现标准事件处理程序
事件,MSDN解释:类或对象可以通过事件向其他类或对象通知发生的相关事情.发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”. 有关事件的理论与好处,在这里就不再废话了,感兴趣的 ...
- 采用Vue2.0开发的分页js组件
2017-11-17 19:14:23 基于jQuery的分页插件相信大家伙已经都用过很多了,今天分享一下基于Vue2.0的分页插件pagination.js 由于项目需求,要求使用 Vue2.0 开 ...
- 让C++控制台程序停下来,实现暂停功能
一.针对Microsoft #include <stdlib.h> (1)第一种方式system( "PAUSE "); -------------------- ...
- 25个Java机器学习工具和库
本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...
- Vim常用操作-合并行。
刚接触 Vim 会觉得它的学习曲线非常陡峭,要记住很多命令.所以这个系列的分享,不会教你怎么配置它,而是教你怎么快速的使用它. 在开发时为了代码美观,经常会把属性用换行的方式显示. <el-di ...
- Git命令行对照表
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...
- LoadRunner性能测试过程中报Error(-17998):Failed to get [param not passed in call] thread TLS entry.
最近与其他公司一起合作使用loadrunner11进行性能测试,在此过程中,遇到Error(-17998)的错误,从网上搜索,找到的答案基本上都是说没有定义事务,但检查所有测试代码,发现都已经定义了事 ...
- 51Nod--1012最小公倍数
1012 最小公倍数LCM 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 输入2个正整数A,B,求A与B的最小公倍数. Input 2个数A,B,中间用 ...