js类型转换的坑

  JS的灵活

  说好听是说JS灵活, 说不好听就是JS的太多, JS类型转换就是一个大坑, JS的类型包括了原始类型的[null, undefined, String ,Number, Boolean],以及对象类型的[function, object];

null, undefined, "", 0, -0, NaN 转换成布尔值是false, 剩下的全转化为 ==>> true;
null, "", false, , [] 转换成数字是 ==>> 0;
undefind, "One", 一个非数字值的数组:["a"], function(){} 转化成数字是 ==>> NaN;
true, 一个值为数字的数组:[1] , 是数字的字符串:"1",转换为数字是 ==>> 1; 

  其中null和undefined没有构造函数, 他们两个转化为对象的时候会报类型错误

  JS把对象转化成原始值

  JS如果把对象转化成只付出 会调用对象的toString()方法,如果toString()方法返回的值是一个对象,那么会调用对象的valueOf()方法,把valueOf()的返回值转化成字符串, 如果该值还不是原始值就会报错;

  对象转化成数字的时候会调用valueOf()方法, 如果该方法返回值非原始值, 那么回调用该对象的toString(),  把toString的返回值转化成数字, 如果toString()返回值还是非原始值,那么就会报错;

  那么为什么第一个是NaN呢? 因为obj是一个空对象, (除了Date类型的对象的valueOf()返回的是数字以外, 所有的对象的valueOf()返回自己 , 神设定~。~),obj的valueOf()返回的是对象,所以他又调用toString()方法, toString()返回了字符串[object Object], [object Object]转化成数字就变成了NaN;

  如果是对象类型转换成原始类型,只要把需要转化的对象放到原始类型的构造函数中进行解包,比如:

Number( {valueOf:function(){return 1111}} ) // ==>>  1111
String( {toString:function(){return 1111}} ) //==>>  "1111"
Boolean( {} )  // ==>> true

  如果你觉得麻烦的话可以通过算术运算符进行快速转换

    var obj = { toString : function() {return 1111}};
    obj+"" ==>> "1111";

    var obj = { valueOf : function() {return 1111}};
    +obj ==>> 1111;

  JS把原始值转化成对象

  要让原始类型转化成对象类型要将元素类型放到对象类型的构造函数中, 需要让构造函数包装

console.log( typeof true ); //==>> boolean
console.log( typeof new Boolean( true ) ) //==>> object

  参考表

  表作为参考, 来自js权威指南, 看过书的应该都记得这表:

原始类型和对象类型 转换成String: 转换成Number 转换成Boolean 转换成Object
undefined "undefined" NaN false throws TypeError
null "null" 0 false throws TypeError
true "true" 1   new Boolean(true)
false "false" 0   new Boolean(false)
"" (empty string)   0 false new String("");Object("")
"1.2" (nonempty, numeric)   1.2 true new String("1.2");Object("1.2")
"one" (nonempty, non-numeric)   NaN true new String("one");Object("one")
0 "0"   false new Number(0);Object(0)
-0 "0"   false new Number(-0);Object(-0)
NaN "undefined"   false new Number(NaN);Object(NaN)
Infinity "Infinity"   true new Number(Infinity);Object(Infinity)
-Infinity "-Infinity"   true new Number(-Infinity);Object(-Infinity)
1 (finite, non-zero) "1"   true new Number(1);Object(1)
{} (any object)   NaN true  
[] (empty array) "" 0 true  
[9] (1 numeric elt) "9" 9 true  
[‘a‘] (any other array) use join() method NaN true  
function(){} (any function "undefined" NaN true  
时间: 2025-01-04 23:30:58

js类型转换的坑的相关文章

JS 类型转换

1.JS类型转换共有三种情况: 转换为布尔值 转换为数字 转换为字符串 2.类型转换表格: 原始值 转换目标 结果 number 布尔值 除了0.-0.NaN都为true string 布尔值 除了空字符串都为true undefined.null 布尔值 false 引用类型 布尔值 true number 字符串 5 -----> '5' Boolean 字符串 true -----> 'true' 数组 字符串 [1, 2] ----> '1, 2' 对象 字符串 {id: 1}

js类型转换-字符串转整型、浮点型方法、强制类型转换等

1. 转换函数: js 提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法, 这两个函数才能正确运行:对其他类型返回的都是NaN(Not a Number).这两个转换函数的结果都是将String数据类型转化为Number. 在 判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串.parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字:如果不是,

Ember.js的那些坑

用了一年Ember.js,从2.3到2.10,因为数据量大,以及项(xu)目(qiu)的复(bian)杂(tai)性踩了不少坑,感觉再也不会爱了.在把这个锅甩出去之前,小小总结一下,以示后人,知己知彼方能百战百胜.注意,这篇我只吐槽. 首先 肯定要吐槽一下压缩后仍旧占用几兆的巨无霸内核JS代码.光这点来说,Ember绝对不适合移动端以及小型项目的开发.哪怕像我参与的这个平台级项目,对于这个大小也是深感蛋疼.而且,Ember的默认配置还是只压缩成vender.js与app.js两个文件而已. 此外

js类型转换

1.js中有六种基本类型,分别是object.number.string.Boolean.null.undefined,其中number.string.Boolean为基本类型,有时使用会强制转换成对象,如:var s="cc";s.length;强制转换成对象是临时对象,设置后,会被销毁掉,比如:s.t=3;alert(s.t);弹出来的就会成了undefined: 2.js需要由一个类型转换成另一个类型,可以使用“+”或者“-”来转换,如var num="3";

Shell、Awk 中自动隐式类型转换的“坑”

1.问题: 在林林总总的编程语言里,弱类型的语言着实不少,一方面这种"动态类型"用起来很方便,而另一方面则"坑"你没商量~ 常见的 SQL.Shell.Awk 都会遇到各种暗藏的"隐式类型转换",下面就列举一些 shell.awk 里的自动隐式类型转换 case,防止掉坑. 注意 shell.awk 的变量为空 字符串.变量为空 未定义.初始值的隐式转换问题: # shell 下的字典排序比较 [email protected] 10:59:23

js 面试的坑

判断页面滚动方向(上下) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style> body{ height:1000px; } </style> <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"

Jquery,JS类型转换

转换成数字 ECMAScript提供了两种把非数字的原始值转换成数字的方法,即parseInt()和parseFloat().注意:只有对String类型(Number除外)调用这些方法,才能正确运行对其他类型返回的都是NaN. 例如: Js代码 var iNum1 = parseInt(“1234blue”);//returns 1234    var iNum2 = parseInt(“oxA”); //returns 10    var iNum3 = parseInt(“22.5″);

js类型转换的各种玩法

前言 对于object和number.string.boolean之间的转换关系 [ ] Object 与Primitive,需要Object转为Primitive [ ] String 与 Boolean,需要两个操作数同时转为Number. [ ] String/Boolean 与 Number,需要String/Boolean转为Number. [ ] undefined 与 null ,和所有其他值比较的结果都是false,他们之间==成立 ToPrimitive是指转换为js内部的原始

boostrap-modal.js中的坑(http://ui2.tinygroup.org/page/index.page中的弹窗插件 )

在使用bootstrap-modal.js的过程中遇到很多抗,记录下.遇到的同学可以一起探讨下.  1.在火狐浏览器中最大化后切换后,弹窗的位置乱跳       解决这个问题找了好久,一直不知道什么原因.看源码的过程中发现了在计算位置时margin的值没有分开计算.       火狐浏览器在用css('margin')计算的时候会出现问题.解决这个办法是讲margin 的值分开设置