js数据类型必须得知道的那些事

记得刚学习js的时候,在变量的赋值上经常会出现一些自认为是莫名奇妙的bug,自己找了半天也找不出问题~
当然js的数据类型转化也是让我头疼不已~ 明明上一秒还是小明,下一秒就变成了小红,经常是让人摸不着头脑.最为一个有自知之明的前端小菜鸟,还是有必要花时间来整理一下这些知识点的 ,把关于数据类型的知识点给整理了一下~做个小小的分享

以下是本文的提纲

数据类型

基本类型

引用类型

不同数据类型的赋值区别

不同数据类型作为参数传递的区别

数据类型隐式转化

基本运算

1.字符串与数组相比

2.==与 = ==

3.布尔类型与其他类型

4.null和undefined

5.引用类型运算

数据类型判断

typeof

Object.prototype.toString.call()

到底什么是数据类型?

就是计算机里面有各种数据值,不同的数据值的处理方式和储蓄方式都不同,我们为这些值分好了类别,统称为 数据类型

通俗点来说,就是计算机也需要对人说人话,对鬼说鬼话~

但是...现实中总是那么残酷,来看几段代码先

 //数据类型间的赋值
 var a =1 ;
 var b =a ;
 function num (c){
  c = 999;
 }
 num(a);
 console.log(a)//1
 console.log(b)//1
 ​
  var obj = {
  a:1
 }
 var obj2 = obj;
 console.log(obj2); //1
 ​
 obj2.a= 10;
 console.log(obj)
 ------------------------------------------------------
 console.log(1 + 'abc') /1abc
 ​
 var obj = {
  width: '100'
 };
 ​
 obj.width + 20 // "10020"
 ----------------------------------------------------
 ​
 var a = [1,2];
 ​
 var b = [3,4];
 ​
 console.log(a+b); //1,23,4
 ​
 ----------------------------------------------------------
 true + 0 // 1</pre>
  • 那为什么会出现这样的情况呢,明明上一秒还是字符串,下一秒就变成了number

  • 数值与字符串相加,结果变成了字符串的拼接

  • 数组间的相加虽然不常见,但是结果也是让人匪夷所思

为了弄清楚这些问题.我不得不查阅了大量资料,以及做一些必要的测试来搞懂他,首先还是要对js中的数据类型要有个大致的了解~

js中的数据类型总共分为2个大类, 基本类型,对象类型,也可以叫做值类型和引用类型

先来看看基本类型,常见的基本类型总共有5种

js中提供了一种检测当前变量的数据类型的方法,也就是typeof关键字,我们先来试试看

注意:[ typeof对于基本类型,除了 null 都可以显示正确的类型 ]

Number

String

Boolean

Undefined

Null

var a = 'abc';    
  var b = 1;
  var c =true;
  var d = undefined;
  var e = null;
 ​
  var f = [];
  var g = {};
 ​
  function h () {
  console.log(1)
  }
  console.log(typeof(a)) //string
  console.log(typeof(b)) //number
  console.log(typeof(c)) //boolean
  console.log(typeof(d)) //undefined
  console.log(typeof(e)) //object</pre>

为什么null打印出来是object呢 , 原因在于这是js的一个语言bug,null 本身是基本类型。

原理是这样的,不同的对象在底层都表示为二进制,在 JavaScript 中二进制前三位都为 0 的话会被判断为 object 类型,null 的二进制表示是全 0,自然前三位也是 0,所以执行 typeof 时会返回“object”。

引用类型:

  • 数组

  • function

  • Obj

 var f = [];    
 var g = {};
 ​
 function h () {
  console.log(1)
 }    
 ​
 console.log(typeof(f)) //object
 console.log(typeof(g)) //object
 console.log(typeof(h)) //object</pre>

在这里其实可以发现,typeof只可以检测基本的数据类型,而引用类型的检测不出具体的数据类型的,关于检测数据类型,我们在后面再看~

基本类型和引用类型之间的区别

我们先来看第一个问题:把boj赋值一份给obj2,当改变了obj2中的属性值,obj的属性值也发生了改变,

不同数据类型间赋值区别

  • 简单数据类型是存在内存中的栈中的,而引用类型的数据是存在内存中的堆中的,但是变量的声明都是在栈上

  • 赋值只是把栈中的内存地址给另外一个变量,基本数据类型就等于把值复制给了另一个,引用类型就等于把我的内存地址赋值给另外一个变量,而他们都指向同一个堆中的数据

  • 而引用类型数据存储在堆中,栈中的地址指向堆,obj1改变堆中的数据,obj又跟她指向同一个.

 //数据类型间的赋值
 var a =1 ;
 var b =a ;
 console.log(a)//1
 console.log(b)//1
 ​
 ​
  var obj = {
  a:1
 }
 var obj1 = obj;
 console.log(obj2); //1
 ​
 obj1.a= 10;
 console.log(obj)</pre>
image.png

一张图简单的来理解

不同数据类型间传参区别

var a =1 ;
 function num (c){
  c = 999;
 }
 num(a);
 console.log(c)//999
 ​
 ​
 var obj = {
  a:10
 }
 ​
 function changen(obj1){
  obj1.a=30;
 }
 changen(obj);
 console.log(obj.a) //30</pre>
image.png

数据类型隐式转化

  • 字符串和数字比较,字符串会被转换数字

  • 布尔值和其他类型比较,会被转换成数字

运算符

基本数据类型

我们发现,js在对不同数据类型做运算的时候,会把不同类型的变量进行转变,比如 1 + '1' = ‘11’,简单数据类型的隐式转化常见的有以下几种

  • 字符串加数字,数字就会转成字符串(上面已经写了)

  • 数字减字符串,字符串转成数字 (1 - '1' //0)

console.log(1-'1')  // 0
  • 如果字符串不是纯数字就会转成NaN。字符串减数字也一样, 乘,除,大于,小于跟减的转换也是一样。
console.log(1-'1a') //NAN</pre>

==与===

== 允许在相等比较中进行强制类型转换,而== = 不允许,如果两个值的类型不同,我们就需要考虑有没有强制类型转换的必要,有就用= =,没有就用===,不用在乎性能。

 //字符串和数字之间的相等比较,将字符串转换为数字再进行比较
 var a =1;;
 var b ='1';
 a==b //true
 a===b //false</pre>

其他类型与布尔类型相比

//先将布尔类型转为数字
 true //1
 false //0
 var a = true;
 var b = '999';
 a == b //false</pre>

null和undefined比较

console.log(null == undefined) //trun
console.log(null === undefined) //false</pre>

引用类型

var a = [1,2];
 var b = [3,4];
 console.log(a+b); //1,23,4</pre>

要解决这个疑问,先要了解以下es5的规范

ES5 规范11.6.1 节,如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+ 将进行拼接操作。如果其中一个操作数是对象(包括数组),则首先对其调用ToPrimitive 抽象操作(规范9.1 节),该抽象操作再调用[[DefaultValue]](规范8.12.8节),以数字作为上下文

如果加其中的一个操作数是字符串(或者通过此规范能得到字符串),则进行字符串拼接,否则执行数字加法

ToPrimitive会做以下3件事:

1.先计算obj.valueOf(),,如果结果为原始值,则返回此结果 (obj值的是引用的数据类型)

2.否则.计算obj.toString(),如果结果是原始值,则返回此结果

3.否则,抛出异常

 var arr = [1,2];
 console.log(arr.valueOf()); // [1,2]
 console.log(arr.toString()); // 1,2</pre>

数据类型检测

typeof(检查基本数据类型)

typeof对于基本数据类型判断是没有问题的,但是遇到引用数据类型(如:Array,obj,function)是不起作用的,输出的都是object,那个这个时候检查引用数据类型就要用到下面这个方法了

 var f = [];    
 var g = {};
 ​
 function h () {
  console.log(1)
 }    
 ​
 console.log(typeof(f)) //object
 console.log(typeof(g)) //object
 console.log(typeof(h)) //object</pre>

Object.prototype.toString.call() (检查引用数据类型)

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

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,199评论 0 4
  •   引用类型的值(对象)是引用类型的一个实例。   在 ECMAscript 中,引用类型是一种数据结构,用于将数...
    霜天晓阅读 1,031评论 0 1
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,092评论 0 21
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,076评论 1 32
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,039评论 0 3