JavaScript学习整理1

2016-08-25  本文已影响0人  hk_kh

一、关于CSS和JS在网页中的放置顺序。

  1. 通常将css放在页面的上面<head></head>里,js放在下面挨着</body>。2.如果遇到css文件很多很大,会加大白屏时间,也会放在底部。而有的js必须放在页面之前加载的,需要放到顶部。可以把必须的js和css放顶部,把不那么重要的css和js放底部。3.js放前面加defer属性。这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。但采用这种方法,会有一种缺陷。在有些浏览器中。并不会按照你自己文件的顺序执行下来。并且有的浏览器还会忽略这种属性。
  2. 浏览器的解析方式。

3 . 网页的渲染机制。
浏览器解析html页面下载html,在内存中把html代码转化成Dom Tree->解析 CSS 标签, 构建 CSSOM 树->把 DOM 和 CSSOM 组合成 渲染树 (render tree)->在渲染树的基础上进行布局, 计算每个节点的几何结构->把每个节点绘制到屏幕上 (painting)。

4 . js阻塞
引用的外部js放在下面,原因是js会阻塞加载,会影响页面加载的速度,如果js文件比较大,算法也比较复杂的话,影响更大。CSS放在前端是页面渲染时首先是根据DOM结构生成一个DOM树然后加上CSS样式生成一个渲染树,如果CSS放在后面可能页面会出现闪跳的感觉,或者是白屏或者布局混乱样式很丑直到CSS加载完成。
js阻塞下载的原因:
**JS 有可能会修改 DOM. **典型的,可能会有 document.write. 这意味着,在当前 JS 加载和执行完成前,后续所有资源的下载有可能是没必要的。这是 JS 阻塞后续资源下载的根本原因。
JS 的执行有可能依赖最新样式。比如,可能会有 var width = $('#id').width(). 这意味着,JS 代码在执行前,浏览器必须保证在此 JS 之前的所有 css(无论外链还是内嵌)都已下载和解析完成。这是 CSS 阻塞后续 JS 执行的根本原因。
现代浏览器很聪明,会进行 prefetch 优化。性能是如此重要,现代浏览器在竞争中,在 UI update 线程之外,还会开启另一个线程,对后续 JS 和 CSS 提前下载(注意,仅提前下载,并不执行)。有了 prefetch 优化,这意味着,在不存在任何阻塞的情况下,理论上 JS 和 CSS 的下载时机都非常优先,和位置无关。
js非阻塞加载解决方案:用defer标签

二、白屏和FOUC(无样式内容闪烁)问题、加载异步

<pre>
1.<script src="script.js"></script>
2.<script defer src="script.js"></script>
</pre>

async:加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。
defer:加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。
若无defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。

三、JavaScript 定义了几种数据类型? 哪些是简单类型?哪些是复杂类型?

6种数据类型:
数值(number):整数和小数(比如1和3.14)
字符串(string):字符组成的文本(比如"Hello World")
布尔值(boolean):true(真)和false(假)两个特定值
undefined:表示“未定义”或不存在,即此处目前没有任何值
null:表示空缺,即此处应该有一个值,但目前为空
对象(object):各种值组成的集合

简单类型都是按值访问,值不能添加属性,值在内存中占据固定的空间大小,在栈中保存,一个变量向另一个变量复制简单类型的值时会创建这个值的副本。复杂数据类型可以由多个值构成对象,js不允许直接访问对象在内存中的位置,在操作对象时,是在操作对象的引用。对象保存在堆内存中,包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象。
最基本的数据类型(简单类型):数值\字符串\布尔值
特殊值(简单类型):undefined\null
合成类型(复杂类型):对象

四、NaN、undefined、null

  1. NaN:not a number,表示非数字,NaN和任何值都不相等,包括它自己,该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。语法:Number.NaN。
    NaN == NaN; //false
    typeof(NaN)结果确是number。
    isNaN()来判断这个数字是不是NaN,包含着隐式类型转换Number()。

  2. undefined:undefined的类型只有一个值,就是特殊的undefined,使用var申明但未对其加以初始化时,这个变量的值就是undefined。
    对未申明的变量执行typeof返回undefined值。为初始化的变量typeof同样会返回undefined值。原因可能是实际上都没有对他们进行实际性的操作(即初始化)。

3 .null:第二个只有一个值的数据类型,其值为特殊的null。null可以理解为空对象指针。
null是一个表示"无"的对象,转为数值时为0;
undefined是一个表示"无"的原始值,转为数值时为NaN。
Number(null)结果为0,Number(undefined)结果为NaN。

五、typeof和instanceof的作用和区别

  1. typeof:
    typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型。返回值是一个字符串,该字符串说明运算数的类型,返回结果有number,boolean,
    string,function,object,undefined。可以使用 typeof 来获取一个变量是否已经赋值,如 if(typeof a!="undefined"){alert("ok")}。
  2. instanceof :判断一个变量是否是某个对象(类)的实例,返回值是布尔类型。一般说来只有使用构造函数创建的对象才会返回true,否则返回false,不过数组是一个例外,都会返回true。
    x instanceof y?alert("true"):alert("false"); //x是y的实例?真:假
上一篇 下一篇

猜你喜欢

热点阅读