发布时间:2022-08-10 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

javaScript有哪些数据类型,有什么区别

javascript有八种数据类型:undefined, Null, Boolean, Number, String, Symbol, Biglnt,Object。

symbol和Biglnt是ES6新增的数据类型:

这些数据类型分为基本数据类型和引用数据类型:

基本数据类型和引用数据类型的区别在于存储位置不同:

堆和栈存在于数据结构和操作系统内存中

数据结构中:

操作系统内:

数据类型检测的方式有哪些

(1)typeof

数组,对象,null都会被判断为object

console.log(typeof 2);               // number
console.log(typeof true);            // boolean
console.log(typeof 'str');           // string
console.log(typeof []);              // object    
console.log(typeof function(){});    // function
console.log(typeof {});              // object
console.log(typeof undefined);       // undefined
console.log(typeof null);            // object

(2)instanceof

  instanceof可以正确判断对象的类型,其内部运行机制时在原型链中能否找到该类型的原型。

console.log(2 instanceof Number);                    // false
console.log(true instanceof Boolean);                // false 
console.log('str' instanceof String);                // false 
 
console.log([] instanceof Array);                    // true
console.log(function(){} instanceof Function);       // true
console.log({} instanceof Object);                //true            

  instanceof只能正确判断引用数据类型,而不能判断基本数据类型。

  instanceof运算符可以用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性。

(3)constructor

console.log((2).constructor === Number); // true
console.log((true).constructor === Boolean); // true
console.log(('str').constructor === String); // true
console.log(([]).constructor === Array); // true
console.log((function() {}).constructor === Function); // true
console.log(({}).constructor === Object); // true

  constructor有两个作用:一是判断数据的类型,二是对象实例通过constructor对象访问的构造函数,需要注意:如果创建一个对象来改变它们的原型,constructor就不能判断数据类型

function Fn(){};
Fn.prototype = new Array();
var f = new Fn();
console.log(f.constructor===Fn);    // false
console.log(f.constructor===Array); // true

(4)Object.prototype.toString.call()

   Object.prototype.toString.call() 使用Object对象的原型方法toString来判断数据类型:var a = Object.prototype.toString;

console.log(a.call(2));         //[object Number]
console.log(a.call(true));    //[object Boolean]
console.log(a.call(
'str'));    //[object String]
console.log(a.call([]));    //[object Array]
console.log(a.call(
function(){}));    //[object Function]
console.log(a.call({}));    //[object Object]
console.log(a.call(undefined));  //[object Undefined]
console.log(a.call(
null));    //[object Null]

判断数组的方式

let obj = [1,2,3]
Object.prototype.toString.call(obj).slice(8,-1) === 'Array'
let obj = [1, 2, 3]
console.log(obj.__proto__ === Array.prototype)
 fn()
  function fn() {
    let obj = [1, 2, 3]
    console.log(Array.isArray(obj));
  }
  let obj = [1, 2, 3]
  console.log(obj instanceof Array);
  let obj = [1, 2, 3]
  console.log(Array.prototype.isPrototypeOf(obj));

null和undefined的区别

    1. undefinednull都是基本数据类型,这两个基本数据类型都只有一个值,就是undefined和null.

    2. undefined代表的是未定义,null代表的是空对象。一般声明了变量但还没有定义的时候会返回undefined,null主要用于赋值给一些可能会对象的变量,作为初始化。

    3. 使用typeof对undefin进行判断会返回undefined,使用typeofnull进行判断会返回Object。
console.log(null == undefined);          //true      
console.log(null === undefined);        //false

 0.1+0.2 !== 0.3,如何让其相等

let n1 = 0.1, n2 = 0.2
console.log(n1 + n2)    //0.30000000000000004

toFixed(num)方法可以把Number四舍五入为指定小数位的数字。

出现0.1+0.2 !== 0.3是因为计算机是通过二进制方式存储的,

isNaN和Number.isNaN函数的区别

Object.is()与比较操作符“===”,“==”的区别

    • 使用双等号(==)进行相等判断时,如果两边的类型不一致,则会进行强制类型转化后再进行比较。

    • 使用三等号(===)进行相等判断时,如果两边的类型不一致时,不会做强制类型准换,直接返回 false。

    • 使用 Object.is 来进行相等判断时,一般情况下和三等号的判断相同,它处理了一些特殊的情况,比如 -0 和 +0 不再相等,两个 NaN 是相等的。