js数据类型是js中的基础知识点,也是前端面试中一定会被考察的内容。本文旨在知识的梳理和总结,希望读者通过阅读本文,能够对这一块知识有更清晰的认识。文中如果出现错误,请在评论区指出,谢谢。

js数据类型都有什么?

答:js数据类型一共有7种,两大类:原始类型,引用类型(对象)

原始类型包括:boolean, null,undefined,number,string,symbol


为什么1.toString会报错?

答:js中点有两种,小数点和访问对象属性的点,如果一个表达式中有两个以上的点,那么第二个及后面的点会被js引擎当作是访问对象属性的点。而第一个点会有两种情况,js引擎在解读以数字开头的第一个点时,会被当成小数点进行处理,而'toString()’会被作为一个不合法的浮点数来解释,所以报错。

而1.2.toString()则不会报错。


symbol是什么数据类型?

答:原始数据类型。symbol是ES6引入的一种新的原始数据类型,表示独一无二的值。symbol值由Symbol函数生成。


为什么0.1+0.2 !== 0.3?

答:我们在控制台中打印0.1+0.2的时候,可以看到结果为0.30000000000000004。而不是0.3。这是因为在计算机中,数字无论是定点数还是浮点数都是以二进制的方式进行存储的。而0.1和0.2转换成二进制后会无限循环,JavaScript使用Number类型表示数字,遵循IEEE754标准。在进行运算时,先转换二进制,由于IEEE754尾数位数限制,多余部分舍弃,这样在进制之间的转换中进度已经损失,由于指数位数不相同,运算时需要对接运算,也可能产生精度损失,所以计算结果出现偏差。解决问题的最常用的方法就是将浮点数转化为整数计算。


null是对象类型么?

答:null是原始数据类型,虽然typeof null === ‘object’,但是这是js的一个历史遗留Bug。


说一说对象类型和原始类型的不同

答:对象类型,也叫做引用类型。与原始类型不同的是,对象类型是在计算机内存中帮我们开辟一个空间来存放值,这个空间会有一个地址(指针)。例如:

const a = []

对于常量a来说,假设内存地址为#001,那么在地址#001的位置存放了值[],常量a存放了地址#001,所以

const a = {}
b = a
b[‘key’] = ‘value'
console.log(a[‘key']) //‘value'

当我们给变量b赋值的时候,是将a存放的内存地址(指针)复制给了b。所以a和b指向了同一个内存空间,这样当内存空间存放的值放生了变化时,a和b同时被影响。


请说明p1,p2的值

function test(person){
person.age =26
person = {
name:'yyy’,
age:30
}
return person
}
const p1 = {
name:'yck’,
age:25
}
const p2 = test(p1)
console.log(p1)// -> ?
console.log(p2)// -> ?

答:

p1->{name: "yck", age: 26}

p2 ->{name: "yyy", age: 30}

函数传参是传递对象指针的副本,到函数内部修改参数的属性这步,当前的p1值也被修改了,但是放我们重新为person分配了一个对象时,person拥有了一个新的地址,也就和p1没有任何关系了。


说一下js类型判断的方法

1.typeof 对于原始类型来说,除了null都可以显示正确类型(null->object)

2.typeof 对于对象来说,除了函数都会显示object(function -> function)

3.instanceof 可以判断某个变量是否是每个对象的实例。

4.比较理想的方法是 Object.prototype.toString.call(variable)


如何判断一个对象是空对象

1.Object.keys({}).length === 0

2.JSON.stringify({}) === ‘{}'


类型转换

转布尔值

1.在条件判断时,除了undefined, null,false,NaN,’’,0,-0,其他所有值都转化为true,包括空对象

对象转原始类型顺序

1.判断是否为原始类型,如果不是,继续下一步

2.调用x.valueOf(),如果转换为基础类型就返回转换的值,如果没有,继续下一步

3.调用x.toString(),如果转换为基础类型就返回转换的值,如果没有,继续下一步

4.报错

四则运算中的类型转换

1.加法运算,如果一方为字符串或者引用类型,那么会转换为字符串进行运算

2.加法运算,如果一方为布尔类型,那么会转换为数字进行计算(引用类型,字符串除外)。

3.加法运算,undefined与任何值相加,值都为NaN(字符串,引用类型相加除外)

4.加法运算,如果一方为null, 那么会转化为数字进行运算,null值为0(字符串,引用类型相加除外)

5.加法运算,如果一方为数字, 那么会转化为数字进行运算(字符串,引用类型相加除外)


== 和===的区别

== 当比较的两者类型不同时会进行类型转换,

- 1==‘1’ //true 此情景 string转number
- null == undefined //true 如果仅需要过滤掉null, undefined 两种属性时可以利用此特性
- [] == ! [] //true 因为对象转基本类型后做比较 false == fase 0 == 0
- [] == ![] //true
- [] == false //true
- '' == false //true
- '' == Number(false) //true
- '' == 0 //true
- Number('') == 0 //true
- 0 == 0 //true

前端面试:js数据类型的更多相关文章

  1. 前端面试 js 你有多了解call,apply,bind?

    函数原型链中的 apply,call 和 bind 方法是 JavaScript 中相当重要的概念,与 this 关键字密切相关,相当一部分人对它们的理解还是比较浅显,所谓js基础扎实,绕不开这些基础 ...

  2. 前端基础——js数据类型及判断方法

    一.数据类型 我们通常熟知的数据类型有六种,包括5种基本数据类型(Number, String, Boolean, Undefined, Null)和一种引用数据类型(Object).ES6又新增了一 ...

  3. 前端面试js题

    var a=10; (function(){ console.log(a); var a=100; })(); 结果:输出undefined 解释: function中有var a=100; 声明会提 ...

  4. 前端面试题目汇总摘录(JS 基础篇)

    JS 基础 JavaScript 的 typeof 返回那些数据类型 object number function boolean undefined string typeof null; // o ...

  5. 前端面试绝对会考的JS问题!【已经开源】

    写在前面 [前端指南]前端面试库已经开源,正在完善之中 [x] css问题 [x] html问题 [x] javascript问题 github地址 https://github.com/nanhup ...

  6. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

  7. 2019前端面试系列——JS面试题

    判断 js 类型的方式 1. typeof 可以判断出'string','number','boolean','undefined','symbol' 但判断 typeof(null) 时值为 'ob ...

  8. 前端面试之JavaScript的基本数据类型!

    前端面试之JavaScript的基本数据类型! JS的基本数据类型 数字 字符串 布尔值 JavaScript中有两个特殊的原始值: null (空) 和undefined (未定义), , 它们不是 ...

  9. 史上前端面试最全知识点(附答案)---html & js & css

    史上前端面试最全知识点(附答案) 一.html & js & css 1.AMD和CMD是什么?它们的区别有哪些? AMD和CMD是二种模块定义规范.现在都使用模块化编程,AMD,异步 ...

随机推荐

  1. Linux常用命令英文全称与中文解释 (pwd、su、df、du等)

    https://blog.csdn.net/qq_40334837/article/details/83819735 Linux常用命令英文全称与中文解释 apt: Advanced Packagin ...

  2. 2.5 【配置环境】多浏览器驱动 (chrome、IE、Firefox)❀

    来源:http://blog.csdn.net/huilan_same/article/details/51896672 http://www.cnblogs.com/thinkCoding/p/64 ...

  3. EVE-NG镜像模板资源占用统计

    转:http://www.emulatedlab.com/forum.php?mod=viewthread&tid=432&extra=page%3D1 EVE  Image fold ...

  4. C语言 exit

    C语言 exit 在main函数中调用exit和return结果是一样的,但在子函数中调用return只是代表子函数终止了,在子函数中调用exit,那么程序终止. 案例 #include <st ...

  5. Python 多任务(进程) day1(3)

    进程间的通信 可以用socket进行进程间的通信 可以用同意文件来进行通信(但是在硬盘上读取和写入比较慢,内存运行太快了) Queue队列(记得是队列)  在同一内存中通信 因为进程之间不能共享全局变 ...

  6. FileOutputStream,BufferedOutputStream,FileWriter 效率比较

    测试代码: /** * 写文件 * FileOutputStream, BufferedOutputStream, FileWriter * 三个流 效率比较 */ @Test public void ...

  7. Centos6.10-FastDFS-Tracker-Nginx示例配置

    nginx 安装过程<详见> 1.进入工作目录 cd /usr/local/nginx/conf 2.创建子目录 mkdir configs 3.创建storage代理配置 cd conf ...

  8. JS高级---原型的引入,原型添加的方法解决数据共享

    原型的引入:解决:通过构造函数创建对象带来的问题,即浪费内存(一个对象开一个内存,多个对象开多个内存) 通过原型来添加方法,解决数据共享,节省内存空间 <script> function ...

  9. vue中使用vue-i18n 一个简单的国际化操作

    1.安装:npm install vue-i18n --save-dev 2.在main.js文件中引入: import VueI18n from 'vue-i18n' Vue.use(VueI18n ...

  10. Laravel Vuejs 实战:开发知乎 (6)发布问题

    1.view部分: 安装一个扩展包:Laravel-UEditor composer require "overtrue/laravel-ueditor:~1.0" 配置 添加下面 ...