NaN出现的情况:

  • 1、数字+undefined
  • 2、用Number()、parseInt()、paseFloat()、将其他的数据类型转换为Number类型;如果不能有效转化,结果就是NaN;

数据类型转化的:

  1. NaN!==NaN//NaN永远不等于NaN,NaN和所有的东西都是不相等的;
  2. []!==[] //对象永远和对象不相等;
  3. Object==Boolean、都转换成数字;(Object先转为sring,然后转number)
  4. Object==Number //Object先转为sring,然后转number)
  5. Object==String//Object转成string
  6. String==boolean //都转成数字;然后比;
  7. String==Number//string转成数字
  8. Number==boolean //boolean转成number
  9. null==undefined//结果为true
  10. null或者undefined与其它任何数据类型都是不相等的;

false类型的:

  1. null、
  2. undefined、
  3. NaN、
  4. 0,
  5. “”
  6. false本身、

360面试题:下面两个都是成立的,很多人死在这道题里;

  • []==false;//成立、都变成数字,然后比
  • ![]==false;//也成立;先判断![](false)、然后和false对比;所以是true、!是一元运算符,这个优先级是最高的;

将其它数据类型,转化成boolean数据类型。只有6个是false;(null、undefined、NaN、0、“”、false本身;)

什么时候是null;什么时候是undefined

通过DOM方法或者属性获取元素,没有获取不到,默认的结果是null;如果获取到了,就是当前的元素对象;如下:

console.log(document.getElementById("zhuanbang"));
//因为没有zhuanbang这个ID;结果是null

如果一个对象中,没有这个属性,则输出undefined

var obj={};
console.log(obj.age);
//输出undefined

浏览器读取js代码的流程

//浏览器读取js代码的流程;
//1>在刚开始加载页面的时候,浏览器会天生自带一个供我们当前JS代码执行的环境,我们把这个环境称之为栈内存;我们也叫它为作用域;或者说作用域就是栈内存;
//而且开始加载页面的那个作用域称之为全局作用域。前端工作中浏览器的全局作用域是(window);
//2>当开始加载js代码之前,首先会把当前全局作用域下带var 和function关键字进行提前的声明或者定义;我们把这种机制叫“预解释”(也有叫变量提升的),预解释和变量提升是一个意思;
//在全局作用域下声明的变量叫全局变量,也叫公用变量;
//带var关键字的是提前的声明;var num=12;中var num就是声明;给变量赋值叫定义;
//声明:declare就是var 变量名;只是声明没有赋值的话,默认的值是undefined;这个时候是加载js之前的,只是声明一下,并没有赋值;要等加载后才可以赋值;
//定义:defined 给变量名赋值;
//3>加载js代码;
//引用数据类型:先开辟一个内存空间,把属性名和属性值存起来,我们把这个用来存储值的内存空间,叫“堆内存”
//栈内存和堆内存的区别;
//栈内存(作用域):1是用来从上到下执行js代码;2、存储基本类型的值。var num=12;这类的基本数据类型是储存在栈内存中的;
//堆内存:是用来储存引用数据类型里面的值的;引用数据类型,是把堆内存的内存空间名字赋值给obj这个变量;obj储存是内存地址,而不是代码(新开辟的内存地址是把代码当做字符串来储存的)

下面是一个例子:

<script>
//预解释:var num;此时没有num的定义;
console.log(num);//此时只是预解释过定义没有赋值,所以出来undefined;
var num=12;
console.log(num);//此时是12.
</script>

预解释:是浏览器自带的默认机制;

下面重要

    //预解释:var num;此时没有num的定义;
console.log(num);//此时只是预解释过定义没有赋值,所以出来undefined;
var num=12;
console.log(num);//此时是12.

var oDiv=document.getElementById("div1");
oDiv.style.backgroundColor=red;
//DOM方法获取的元素都是对象数据类型的;用typeof检测,返回的结果是“object”既然是对象数据类型,就存在相关的属性名和属性值;(可以通过dir输出,然后看控制台,跟着上面一个一个找,)oDiv是对象,oDiv里的style也是一个对象,会再开辟一个空间供style使用;如果代码给style的backgroundColor加颜色,这个时候是没有加的;现在仅仅是预解释;
//style对应的堆内存改变了,则oDiv对应的这个大的堆内存也改变的,JS里只有堆内存才会影响元素的样式,栈内存并不能改变style样式(基本数据类型只是存在栈内存里,不能用基本数据类型改变style);

““““