饥人谷技术博客我爱编程

JS语法

2016-08-13  本文已影响117人  婷楼沐熙

JavaScript基本概念、基础数据类型、运算符、流程控制语句。


一、CSS和JS在网页中的放置顺序是怎样的?

CSS和JS在网页中的顺序是非常重要的,它会对其他资源的加载顺序产生影响。

二、解释白屏和FOUC

白屏和FOUC是浏览器加载和页面的显示方式不同造成的。

三、async和defer的作用是什么?有什么区别。

引入JS文件必须要用到<script>标签,这个标签有两个和性能以及JS文件下载执行相关的属性,也就是async和defer。

<script src="script.js"></script>

如果没有async和defer属性,浏览器会立即加载并执行指定的脚本。这里的“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。

<script async src="script.js"></script>

async是html5中新增的属性,它的作用是能够异步加载和执行脚本,不会因为加载脚本而阻塞页面的加载,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。一旦加载到就会立刻执行,很有可能不是按照原本的顺序来执行的。如果js前后有依赖性,用async,就很有可能出错。

<script defer src="script.js"></script>

如果script加了defer属性,即使放在head里面,它也会在HTML解析完成之后再去执行,就相当于把script放到了页面底部。有 了defer,加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。也就是说JS的加载不会阻塞页面的渲染和资源的加载。但defer会按照原本的JS的顺序执行,所以如果前后有依赖关系的JS可以放心使用。

详细资料还可以参考script的defer和async

四、简述网页的渲染机制。

详细资料可以参考:
前端必读:浏览器内部工作原理
How browsers work

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

JavaScript语言的每一个值都属于某一种数据类型。JavaScript的数据类型一共有六种,分为五种简单数据类型(也称为基本数据类型):

还有一种复杂数据类型—object,也就是对象,它表示各种值组成的集合。对象又可以分成三个子类型。

六、NaN、undefined、null分别代表什么?

七、typeof和instanceof的作用和区别?

因为ECMAScript是松散型的,所以需要一种手段来检测给定变量的数据类型。JS中有三种方法来确定一个值到底是什么类型。分别为:typeof运算符、instanceof运算符以及`Object.prototype.toString方法。

八、代码

  1. 完成如下代码判断一个变量是否是数字、字符串、布尔、函数 (难度*)。
    ps: 做完后可参考 underscore.js 源码中部分实现。
function isNumber(el){
 // todo ...
}
function isString(el){ 
//todo ...
}
function isBoolean(el){ 
//todo ...
}
function isFunction(el){ 
//todo ...
}
var a = 2,
 b = "jirengu",
 c = false;
alert( isNumber(a) ); //true
alert( isString(a) ); //false
alert( isString(b) ); //true
alert( isBoolean(c) ); //true
alert( isFunction(a)); //false
alert( isFunction( isNumber ) ); //true

DEMO1
DEMO2

2.以下代码的输出结果是?(难度**)

console.log(1+1);    //2。 加法计算
console.log("2"+"4");     //24。 有一个是字符串,转换为字符串的拼接。
console.log(2+"4");    //24。 有一个是字符串,转换为字符串的拼接。
 console.log(+new Date());    //1471048600952。 获得当日的日期,用new Date() 参与计算会自动转换为从1970.1.1开始的毫秒数。
console.log(+"4");    //4。  只有一个字符串,会转换成数字。
运行结果

JS中的运算符主要用于连接简单的表达式,组成一个复杂的表达式。常见的有算数表达式、比较表达式、逻辑表达式、赋值表达式等,也有单目运算符,指操作原始表达式。大多数运算符都由标点符号组成(+、>=、!),也有关键字表示的运算符,如typeof、delete、instanceof等。
在JavaScript中运算符通常会根据需要对操作数进行类型转换,乘法操作符*希望操作数是数字,但是 "3" * "5" 也是合法的,JavaScript会自动将其转换为数字计算,返回Number 15。
有些操作符对不同的数据类型有不同的含义,比如:+

3.以下代码的输出结果是? (难度***)

var a = 1;
a+++a;  //3
typeof a+2;  //number2

a+++a表达式当中,后置递增的优先级最高。所以相当于(a++)+a。a一开始赋值为1,a++表示先赋值再自增,所以a++的计算结果为1,且此时a等于2。所以a+++a表达式的计算结果为3。
typeof a+2中,typeof的优先级比“+”高,所以它会先计算typeof a,得到的输出是"number"。然后是一个字符串加上一个数字,会把数字转换成字符串。所以得到的输出为"number2"的字符串。

运行结果
运算符优先级
4.遍历数组,把数组里的打印数组每一项的平方(难度**)。
var arr = [3,4,5]
// todo..// 
输出 9, 16, 25 
运行结果

5.遍历 JSON, 打印里面的值(难度**)。

var obj = { 
name: 'hunger', 
sex: 'male', 
age: 28
}
//todo ...
// 输出 name: hunger, sex: male, age:28
运行结果

6.下面代码的输出是? 为什么 (难度***)

console.log(a);
var a = 1;
console.log(a);
console.log(b);

JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,给他初始值undefined,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升。
所以在上面的代码中,变量a先被声明,再执行console.log(a);,也就是相当于执行了var a; console.log(a);。因为此时a没有赋值,所以console.log(a);结果为undefined。然后a被赋值为1,再执行console.log(a);,所以console.log(a);结果为1。最后,console.log(b);,由于b变量不存在,所以结果报错。

运行结果
这也正体现了变量提升的作用。我们在使用一个变量之前必须声明变量,但是由于变量提升,我们如果声明了变量,即使在声明语句前使用也是可以的,只不过其值是初始值undefined。
上一篇 下一篇

猜你喜欢

热点阅读