目录
一、选择题
1、下列关于 JavaScript 模块化的描述,错误的是
A、模块化有利于管理模块间的依赖,更依赖模块的维护
B、主流的模块化包括CommonJS,AMD,CMD等
C、Sea.js遵循AMD规范,RequireJS遵循CMD规范
D、AMD推崇依赖前置,CMD推崇依赖就近
正确答案:C
解析:
(1)AMD 是 "Asynchronous Module Definition" 的缩写,指异步模块定义
①它采用异步方式加载模块,模块的加载不影响后面语句的运行
②所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完后,这个回调函数才会运行
③ AMD 也采用 require() 语句加载模块,但是不同于 CommonJS,主要有两个Javascript库实现了AMD规范:require.js和curl.js
④更多参考链接
①性质
AMD 是 RequireJS 在推广过程中对模块定义的规范化产出
CMD 是 SeaJS 在推广过程中对模块定义的规范化产出
②区别
依赖的模块:AMD 是提前执行,推崇依赖前置,CMD 是延迟执行,推崇依赖就近
(3)例子:直观查看依赖的就近和前置
<script>
// CMD
define(function(require,exports,module){
var a = require('./a')
a.doSomething()//a执行某些事情
var b = require('./b')//依赖可以就近
b.doSomething()//b执行某些事情
});
// AMD
define(['./a','./b'],function(a,b){//依赖必须一开始就写好
a.doSomething()//a执行某些事情
b.doSomething()//b执行某些事情
})
</script>
2、执行下列代码,输出结果为()
var val = 12;
function fun1(){
console. log(val);
var val = 20;
console.log(val);
}
fun1();
A、12 20
B、12 12
C、undefined 20
D、20 undefined
正确答案:C 你的答案:A
解析:
(1)选项解释
①当局部变量和全局变量同时存在时,局部变量的优先级更高
②在函数fun1内部,由于存在变量提升,会先使用var声明局部变量val,而变量的赋值并不会跟着一起提升,接着使用console.log()输出val,由于val变量已声明但未赋值,故输出结果为undefined
③然后再对val进行赋值,其值为20,最后再次输出val,输出结果为20
(2)代码解释:由于var的变量提升,题目的代码相对于如下代码
var val = 12;
function fun1(){
var val
console. log(val);
val = 20;
console.log(val);
}
fun1();
3、以下JavaScript 代码,返回 false 的是
A、var test=1;typeof test=='number';
B、var test=1.2;typeof test=='float';
C、var test=undefined;typeof test=='undefined';
D、var test={};typeof test=='object';
E、var test='4399'-0;typeof test=='number';
F、var test=null;typeof test=='object';
正确答案:B 你的答案:E
解析:
(1)typeof能输出的类型
类型 | 解释 |
---|---|
undefined | 值未定义 |
boolean | 布尔值 |
string | 字符串 |
number | 数值 |
object | 对象或null |
function | 函数 |
Symbol | ES6 新增类型 |
(2)选项解释
①A 选项:typeof tset 返回 'number','number' == 'number',返回 true
②B 选项:typeof tset 返回 'number','number' == 'float',返回 false
③C选项:typeof tset 返回 'undefined','undefined' == 'undefined',返回 true
④D选项:typeof tset 返回 'object', 'object' == 'object',返回 true
⑤E选项:typeof tset 返回 'number', 'number' == 'number',返回 true
- js解释器会将字符串'4399'调用Number()转换为4399,再去计算
- 若是 ‘+’,字符串拼接;如果操作数存在对象、数值、布尔值,调用toString()方法,继续字符串拼接。
- 若是 ‘-’,按照数值来算
⑥F选项:typeof tset 返回 'object', 'object' == 'object',返回 true
4、执行以下程序,下列选项中,说法正确的是()
class Dog{
static dog(){
console.log(this); ...①
}
bark(){
console.log('狗会叫');
}
}
var dog = new Dog();
A、①式的this指代类的实例对象
B、调用dog方法,既可以使用Dog.dog(),也可以使用dog.dog()
C、调用bark方法,只能使用dog.bark(),不能使用Dog.bark()
D、在类中,不允许静态方法和非静态方法重名
正确答案:C 你的答案:A
解析:
(1)dog方法为静态方法,bark方法为实例方法
- 静态方法本身不能使用实例对象来调用,所以this不会指向实例对象
- 静态方法只能由类进行调用,实例方法只能由实例对象进行调用
(2)选项分析
①选项A:static dog() 里的this指代的是 class Dog 这个 class 本身,而bark里的this指向的是类的实例化对象
②选项B:调用 static dog() 方法,只能使用 Dog.dog(); 不可以使用 dog.dog();
③选项C:类中方法前面没有static,则该方法只能通过类的实例化对象调用,不能通过类本身调用
④选项D:由于类内部的静态方法的调用者只能为类,实例方法的调用者只能为实例对象,不会在调用时造成歧义,因此允许重名