一、与 Java 的区别
1、JavaScript 的程序代码由客户端浏览器解释执行;Java 程序则必须先经过编译,转换成 class 文件,在 JVM 环境下执行。
2、JavaScript 模仿 Java 的语法,设计了一套类似于纯面向对象(常称为基于对象)的语法结构。
3、JavaScript 的程序代码直接嵌入 HTML 文件中,而 Java 编写的是一个独立的 Java 程序。
4、JavaScript 是动态的弱类型语言,使用前无需声明变量的数据类型;Java 是静态类型语言,或称为强制类型语言,变量的类型必须事先定义。
二、JavaScript 的作用
1、进行表单验证。
2、实现页面特效。
3、动态调整页面内容。
三、JavaScript 的组成
1、核心语法(ECMAScript)。
2、浏览器对象模型(BOM):提供与浏览器交互的方法和接口。
3、文档对象模型(DOM):提供访问和操作网页内容的方法和接口。
四、说说 JS 的基本规范
1、不要在同一行声明多个变量。
2、请使用===/!==
来比较true/false
或者数值。
3、使用对象字面量替代new Array
这种形式。
4、不要使用全局函数。
5、switch
语句必须带有default
分支。
6、函数不应该有时候有返回值,有时候没有返回值。
7、for
循环必须使用大括号。
8、if
语句必须使用大括号。
9、for-in
循环中的变量,应该使用var
关键字明确限定作用域,从而避免作用域污染。
10、命名规则中构造器函数首字母大写,如function Person(){}
。
11、写注释。
五、什么是全局变量?如何声明?使用全局变量有哪些问题
全局变量是整个代码长度可用的变量,也就是说这些变量没有任何作用域。var 关键字用于声明局部变量或对象。如果省略 var 关键字,则声明一个全局变量。
使用全局变量的优点:减少变量个数,减少由于实际参数和形式参数的数据传递带来的时间消耗。
使用全局变量所面临的问题是本地和全局变量名称的冲突。此外,全局变量破坏了函数的封装性能,很难调试和测试依赖于全局变量的代码。
六、JavaScript 输出方式
1、alert()
:以字符串格式输出。
alert(true) // 输出字符串 true
alert([1,2,3]) // 输出字符串 1,2,3
alert({ name: 'violetks', age: 21 }) // 输出字符串 [object Object]
2、confirm()
:在 alert 的基础上增加了两个选择按钮:确定和取消。
3、prompt("提示句", "值")
:在 confirm 的基础上增加了让用户输入的效果。
4、控制台输出:(快捷操作:变量名.log,然后按 Tab 键补全)
console.log();
console.warn();
console.error();
5、向页面输出内容:document.write();
七、JavaScript 数据类型
- 六个值类型:string、number、boolean、null、undefined、Symbol(ES6 引入,表示独一无二的值)。
- 引用数据类型:Object、Array、Function、Date、RegExp(正则)。
检测类型常用typeof
和instanceof
(1)typeof
:返回值是一个字符串,用来说明变量的数据类型。
- 返回结果:string、number、boolean、function、object、undefined。
- 判断变量是否存在:
typeof a != "undefined"
。 - 对于 Array、Null 等特殊对象使用 typeof 一律返回 object。
(2)instanceof
:用于判断一个变量是否属于某个对象的实例。
({}) instanceof Object //true
([]) instanceof Array //true
(/aa/g) instanceof RegExp //true
(function(){}) instanceof Function //true
typeof bar === “object” 这个验证的风险有哪些?
对于 Array、Null 等特殊对象都是是返回 object,会判断错误。
解决方法:(bar !== null) && (typeof bar === "object") && (!Array.isArray(bar))
console.log(true + 1); //2
console.log('name' + true); //nametrue
console.log(undefined + 1); //NaN
console.log(typeof undefined); //undefined
console.log(typeof(NaN)); //number
console.log(typeof(null)); //object
八、== 和 === 的区别
(1)==:如果两个值类型不同也有可能相等,null 和 undefined 使用 == 判断是相等的。
(2)===:严格相等,类型不同不相等,null 和 undefined 不相等。
(3)== 会自动转换类型,=== 不会。
九、null 和 undefined 的区别
1、undefined
:Undefined 类型,字面意思是未定义的值,表示一个变量最原始的状态,而非人为操作的结果。这种原始状态会在以下 4 种场景中出现:
(1)声明了一个变量但未初始化。
(2)访问对象上不存在的属性。
(3)函数定义了形参,但没有传递实参。
(4)使用 void 对表达式求值。
2、null
:Null 类型,代表 “空值”,表示一个对象被人为的设置为空对象,而非一个变量最原始的状态。代表一个空对象指针,使用 typeof 运算得到 “object” ,是因为 JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此 null 被误判断为 Object 类型。
十、NaN 是 Number 类型,验证它的函数:isNaN()
十一、双问号的使用
let str = name ?? '';
如果 name
存在, str = name
,不存在则 str = ''
。
十二、JavaScript 构造函数和普通函数的区别(★)
1、构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写。
2、构造函数和普通函数的区别在于:调用方式不一样。作用也不一样,构造函数用来新建实例对象。
3、调用方式:普通函数的调用方式直接用person()
,构造函数的调用方式需要使用new
关键字来调用new Person()
。
4、构造函数的函数名与类名相同,Person()
这个构造函数,Person
既是函数名,也是这个对象的类名。
5、构造函数内部用this
来构造属性和方法。
function Person(name, job, age) {
this.name = name;
this.job = job;
this.age = age;
this.sayHi = function() {
console.log("Hi")
}
}
十三、JavaScript 递归函数(★)
1、如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。
2、递归应用例子:求 1~n 的阶乘、求斐波那契数列、实现多级菜单结构。