JavaScript的值类型及类型转换


在JavaScript中,数据类型分为两类,即原始值引用值

原始值

是存储在栈中的简单数据段,它值直接存储在变量访问的位置。
原始值类型:Number、String、Boolean、undefined、null

  • undefined
    当变量 声明了但没有初始化 时候,该变量的默认值即为undefined
    var test ;
    console.log(test); //undefined
    
    没有声明 的变量,值虽然不是undefined,但是数据类型还是undefined
    var test ;
    console.log(typeof (test)); //undefined
    console.log(typeof (myTest)); //undefined
    
    函数无明确返回值时,默认返回值为null
    function test(){}
    console.log(test());
    
  • null
    与undefined的区别是,undefined表示未定义,但是null有值,只不过这个值是空。
    var demo = null;
    console.log(demo); // null
    var test;
    console.log(test); //undefined
    
    当函数返回一个对象,找不到这个对象时候,返回值为null
  • String
    在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。JavaScript打破了这一传统。

引用值

存储在堆中的对象,在变量处的值是一个指针,指向存储对象的内存处。
主要有数组array、对象object、函数function。

这两种类型到底有什么区别?我们来举个例子

var test = 111;
newTest = test;
Test = 222;
console.log(test); //111
console.log(newTest); //222

test值的改变对newTest没有影响。
test是原始值,他的值存在栈里,执行newTest = test,栈内开辟新空间,保存newTest的值,此后test再怎么改变与newTest无关。

var arr = [1,2,3];
newArr = arr;
arr.push(4);
console.log(arr);//[1, 2, 3, 4]
console.log(newArr);//[1, 2, 3, 4]

arr是引用值,他的变量名存在栈里,但值存在堆里,变量名指向的堆空间,执行newArr = arr,变量名newArr与arr指向相同的堆空间,所以arr的值改变,就导致newArr的值也改变。

var arr = [1,2,3];
newArr = arr;
arr = [1,2,3,4,5,6]
console.log(arr);// [1, 2, 3, 4, 5, 6]
console.log(newArr);//[1, 2, 3]

JavaScript类型转换

显式类型转换

typeof可以检验数据类型
只能返回 numner、string、boolean、undefined、object、function,并且typeof返回结果是string类型

NaN属于number类型

  console.log( typeof(typeof(123))); // string

转换为数字字符串允许开头结尾有空格,但是只要有非空格字符,字符串转换为数字的结果就是NaN

  • Number( ) 把其他类型的数据转换成数字类型的数据。
var demo = Number('123');
console.log(demo) // number123
demo = Number(true)
console.log(demo) // 1
demo = Number(NaN)
console.log(demo) // NaN
demo = Number(undefined)
console.log(demo) // NaN
var demo = Number("ooo");
console.log(demo) //NaN
var demo = Number(function(){});
console.log(demo) //NaN
  • parseInt(string, radix) 解析一个字符串,并返回一个整数
    string表示要被解析的字符串。
    radix表示要将字符串转化的进制。
    值介于 2 ~ 36 之间。 该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。 如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
    当参数string里面既包括数字字符串又包括其他字符串的时候,它会将看到其他字符串就停止了,不会继续转换后面的数字型字符串了。
  parseInt('123abc345') // 123
  parseInt('abc123') // NaN
  parseInt('123') // 123
  parseInt('abc') // NaN
  parseInt(true) // NaN
  • parseFloat( )将字符串转换成浮点类型的数字
    识别第一个小数点以及后面的数字,第二个小数点后的无法识别,遇到非数字字符串停止识别。

  • toString( )将任意数据类型转换为字符串
    与前几个不同的是,他是对象上的方法
    undefiend和null没有toString方法

    引用值类型(对象、函数、数组)转换为字符串,步骤如下

    1. 如果对象有toString(),调用 toString(),如果返回原始值,将这个值转换为字符串;如果返回的是复合类型或对象没有toString(),则调用 valueOf()
    2. 如果 valueOf()返回原始值类型,将这个值转换为字符串;
    3. 如果返回的是复合类型,则抛出一个类型错误异常。
  • Boolean( )把任何类型转换成布尔类型

  Boolean(0); // false
  Boolean(undefined); // false
  Boolean(null); // false
  Boolean(''); // false
  Boolean(NaN); // false

隐式类型转换

  • isNaN()
    检测数据是不是非数类型。
    先将你传的参数调用一下Number方法之后,再看看结果是不是NaN,不过这个方法可以检测NaN本身。
  isNaN(NaN); // true
  • ==

1,null和undefined,相等。
2,数字和字符串,转化为数字再比较。
3,如果有true或false,转换为1或0,再比较。
4,如果有引用类型,优先调用valueOf。
5,其余都不相等。

console.log(undefined == false); // false
console.log(null == false);      // false
console.log(0 == false);         // true
console.log(NaN == false);       // false
console.log("" == false);        // true
1 !== '1';     // true
1 !== 1;     // false
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 值类型转换将值从一种类型转换为另一种类型通常称为类型转换,这是显示的情况;隐式的情况称为强制类型转换。JavaSc...
    xpwei阅读 3,502评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 昨天描绘了一个画面,“我跪在破碎的房间里想要收拾残骸,但是我不知道从哪里开始,无能为力,这种无力感让我觉得很难过。...
    无所事事的饭饭阅读 443评论 1 3
  • 新的一天,新的一切,满满的能量等待释放,加油吧!
    丶柒v阅读 141评论 0 0
  • 再一遍写我,有些不知所措 我丢了公交卡,丢了钱包 同时也丢了身份证,这个城市的借记卡和信用卡 我感觉自己成了无人领...
    Jonah_Wang阅读 163评论 0 0