JS复习(拟)
简答题(拟)
变量的命名规则
- 变量必须以字母开头
- 变量也能以$和_开头(不推荐)
- 变量名不能包含空格或其它标点符号
- 变量名称对大小写敏感
变量作用域
变量分为 全局变量 和 局部变量
全局作用域
- 变量在函数外定义,即为全局变量
- 全局变量有全局作用域:网页中所有脚本和函数均可使用
- 如果变量在函数内,没有使用var关键字声明,该变量为全局变量
局部作用域
- 变量在函数内声明,即为局部变量
- 局部变量有局部作用域:只能在函数内访问
变量生命周期
- 局部变量:在函数开始执行时创建,函数执行完后局部变量会自动销毁
- 全局变量:在页面关闭后销毁
变量提升
JS引擎的工作方式是:先解析代码,获取所有被声明的变量,然后再一行一行地运行代码。这样所有变量声明语句都会被提升到代码头部执行,这就叫做变量提升
注意:底部的变量只是声明提升,赋值不提升
数据类型
两大数据类型:基本数据 和 引用数据
基本数据类型
- 字符串类型(String)
- 数值类型(Number)
- 布尔类型(Boolean)
- Undefined类型(只有一个值undefined)
- Null类型(只有一个值null)
引用数据类型
通常也叫作类,也就是说,遇到引用值时,所处理的就是对象
- Object类型(对象类)
- Array类型(数组类)
- Date类型(日期类)
- RegExp类型(正则表达式类)
- Function类型(函数类)
区别
- 基本数据类型,指的是简单的数据段
- 引用数据类型,指由多个值构成的对象
- 当把对象赋值给另一个变量时,解析器首先要做的是确认这个值是基本数据类型还是引用数据类型
关键字和保留字(作为知识点理解,无大题)
- 如果将保留字用作变量名或函数名,那么除非将来的浏览器实现了该保留字,否则很可能收不到任何错误信息。当浏览器将其实现后,该单词被看做关键字,如此将出现关键字错误
- 除了保留字和关键字,JS对eval和arguments还加了限制。在严格模式下,这两个名字也不能作为标识符或属性名,否则会抛出错误
循环语句
循环语句也称迭代语句,让程序重复执行某个程序块,直到某个特定表达式的结果为假时,程序结束循环
- for语句
- for…in语句
- while语句
- do…while语句
break和continue
用于循环中精确地控制代码的执行(break还可以用于switch…case语句中)
- break:可以立即推出小循环,阻止再次反复执行任何代码
- continue:只是退出当前循环,根据表达式还允许继续进行下一次循环
对象
所谓对象,就是一种无序的集合,由**若干个“键值对(key-value)”**构成
两个层次理解
- “对象”是单个实物的抽象
- “对象”是一个容器,封装了**“属性”和“方法”**
对象的属性和方法
属性
- 所谓属性,就是对象的状态
- 属性可以是任何类型的值,甚至包括其他对象和函数
特性
- 只读
- 无法枚举
- 无法删除
方法
- 所谓方法,就是对象的行为(完成某种任务)
- 当函数作为对象属性时,也被叫做方法
对象的特性
- 抽象性
- 封装性
- 继承性
- 多态性
继承性
继承也可以理解为扩展性。继承可以解决代码复用,让编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类均不要重新定义这些属性和方法,只需要继承父类中的属性和方法
继承方式
-
对象冒充
<script> function Father(name) { this.name = name; this.show = function() { alert("姓名:" + this.name); } } function Son(name) { this.son = Father; this.son(name); } var person = new Son("张三"); person.show(); </script>
-
通过call或者apply来实现
<script> function Father(name) { this.name = name; this.show = function() { alert("姓名:" + this.name); } } function Son(name) { Father.call(this, name); } var person = new Son("张三"); person.show(); </script>
多态性
多态性是指相同操作方式带来不同的结果。从形式上来说,有两种多态。分别为重载和覆盖。覆盖是指子类对父类的行为做了修改,虽然行为相同,但结果不同。重载:是指某一对象的相同行为导致了不同的结果。多态一方面加强了程序的灵活性和适应性,另一方面也可以减少编码工作量
两种多态
- 覆盖:是指子类对父类的行为做了修改,虽然行为相同,但结果不同
- 重载:是指某一对象的相同行为导致了不同的结果
concat()方法
-
concat()方法可以基于当前数组中的所有项, 创建一个新数组
-
concat()方法传递参数的情况下,它只是复制当前数组并返回副本
-
如果给concat()方法的是一个或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中
-
如果传递的值不是数组,这些值就会被简单地添加到结果数组的末尾
<script> var arr = [1, 2, 3, 4]; var arr1 = arr.concat(); var arr2 = arr.concat([2, 4, 6, 8]); var arr3 = arr.concat(10); console.log(arr); // (4) [1, 2, 3, 4] console.log(arr1); // (4) [1, 2, 3, 4] console.log(arr2); // (8) [1, 2, 3, 4, 2, 4, 6, 8] console.log(arr3); // (5) [1, 2, 3, 4, 10] </script>
编程题&操作题(拟)
用if语句输出成绩和等级 优秀 良好 中等 及格 不及格
<script>
// 用if语句输出成绩和等级 优秀 良好 中等 及格 不及格
var score = parseInt(window.prompt("input")); // 或这行写 var score = parseInt(prompt("input")); window.省略
document.write(score);
if (score >= 90 && score <= 100) {
document.write("优秀");
}
if (score >= 80 && score < 90) {
document.write("良好");
}
if (score >= 70 && score < 80) {
document.write("中等");
}
if (score >= 60 && score < 70) {
document.write("及格");
}
if (score >= 0 && score < 60) { // 或这行写 else {
document.write("不及格");
}
</script>
数组arr=[1, 2, 3, 4, 5, 6, “abc”]的最后一项删除,为数组增加一项7,将数组顺序翻转,数组中每一项1,将数组中的各项输出,并写出结果
<script>
// 数组arr=[1, 2, 3, 4, 5, 6, "abc"]的最后一项删除,为数组增加一项7,将数组顺序翻转,数组中每一项1,将数组中的各项输出,并写出结果
var arr = [1, 2, 3, 4, 5, 6, "abc"];
arr.pop(); // 删除最后一项
arr.push(7); // 在最后加一项,值为7
arr.reverse(); // 数组翻转
for (var i = 0; i < arr.length; i++) {
arr[i] += 1; // 数组每一项加1
console.log(arr[i]); // 控制台输出每一项
}
</script>
for循环打印1~100内7和7的倍数
<script>
// for循环打印1~100内7和7的倍数
// var i = 0; // 她给的PPT把这句给支棱外边是想干啥,然后for循环自己填充的,我觉得按照下面这么写就行??
for (var i = 1; i <= 100; i++) {
if (i % 7 == 0) {
document.write(i);
}
}
</script>
while循环打印100以内7的倍数或者含有7的数 PPT代码有问题!!??
<script>
// while循环打印100以内7的倍数或者含有7的数 PPT代码有问题!!??
var i = 0;
while (i <= 100) {
if (i % 7 == 0 || i % 10 == 7) {
document.writeln(i);
}
i++;
}
</script>
产生[min, max]区间内n个不重复的随机数,并打印输出
<script>
// 产生[min, max]区间内n个不重复的随机数
// 这道题PPT给的是一个实现体感功能的函数,没有提到如何调用,如果题干没有明确说明从键盘输入或给定n min max的值我觉得可以不用调用
function myRan(n, min, max) {
var arr = []; // 定义一个空数组装这些随机数
for (var i = 0; i < n; i++) { // 遍历生成n个随机数
/* Math.random()方法默然返回区间[0, 1)的随机小数
Math.random() * (max - min + 1) + min 固定公式 求区间[min, max]内的随机小数
parseInt()对求得的随机小数取整
别忘了把结果存数组里
*/
arr[i] = parseInt(Math.random() * (max - min + 1) + min);
// 下面是个去重操作 把当前生成的随机数去跟已经存进数组的随机数比较,如果有重复的把i-1就可以重生成一个
for (var j = 0; j < i; j++) {
if (arr[i] == arr[j]) {
i = i - 1;
break;
}
}
}
return arr;
}
// 书上的调用并打印输出,可做修改
var str_ran = myRan(10, 20, 100);
console.log(str_ran.toString());
</script>
求n的阶乘,n可输入 递归&非递归
<script>
// 求n的阶乘,n可输入 非递归
var n = parseInt(window.prompt("input"));
var mul = 1;
for (var i = 1; i <= n; i++) {
mul *= i;
}
document.write(mul);
</script>
<script>
// 求n的阶乘,n可输入 递归
function factorial(n) {
if (n == 1) {
return 1;
}
return n * factorial(n - 1);
}
var n = parseInt(window.prompt("input"));
document.write(factorial(n));
</script>
求斐波那契数列第n项,n可输入 递归
<script>
// 求斐波那契数列第n项,n可输入 递归
function fb(n) {
if (n == 1 || n == 2) {
return 1;
}
return fb(n - 1) + fb(n - 2);
}
var n = parseInt(window.prompt("input"));
document.write(fb(n));
</script>
输入 a b c 三个数,打印出最大的一个数
<script>
// 输入 a b c 三个数,打印出最大的一个数
var a = parseInt(window.prompt("请输入a的值"));
var b = parseInt(window.prompt("请输入b的值"));
var c = parseInt(window.prompt("请输入c的值"));
if (a > b) {
if (a > c) {
document.write(a);
} else {
document.write(c);
}
} else {
if (b > c) {
document.write(b);
} else {
document.write(c);
}
}
</script>
用parseInt(),toString()方法,把某进制数转化为8进制或16进制过程和结果
<script>
// 用parseInt(),toString()方法,把某进制数转化为8进制或16进制过程和结果
// 例如把二进制的1010转化为十六进制的数输出
var res = parseInt("1010", 2).toString(16);
console.log(res);
// parseInt(给的数, 给的进制).toString(要转化的进制)
// 注意给的数在传入parseInt()作为第一个参数时,一定要加引号,因为是作为一个字符串形式,第二个参数和toString()的参数则不加引号,因为作为数值
</script>