JS基础 && 注意事项 && 代码调试
Variables allow computers to store and manipulate data in a dynamic fashion. They do this by using a "label" to point to the data rather than using the data itself. Any of the eight data types may be stored in a variable.Variables can store different values at different times.(变量允许计算机以动态方式存储和操作数据。他们使用“标签”指向数据,而不是使用数据本身。八种数据类型中的任何一种都可以存储在变量中。变量可以在不同时间存储不同的值。)
When JavaScript variables are declared, they have an initial value of undefined. If you do a mathematical operation on an undefined variable your result will be NaN which means "Not a Number". If you concatenate a string with an undefined variable, you will get a string of undefined.(声明JavaScript变量时,它们的初始值为undefined。如果对未定义的变量进行数学运算,结果将是NaN,即“非数字”。如果将字符串与未定义的变量连接,则将得到未定义的字符串。)
Write variable names in JavaScript in camelCase. In camelCase, multi-word variable names have the first word in lowercase and the first letter of each subsequent word is capitalized.(在JavaScript中用camelCase规则编写变量名。在camelCase中,多字变量名的第一个字是小写的,每个后续字的第一个字母都大写。----即‘小驼峰命名法’)
注意:
1)JavaScript提供(可识别)八种不同的数据类型,其中七种基本(不可变)数据类型:Boolean、Null、Undefined、Number、String、Symbol(符号,ES6新增)和BigInt(ES2020新增),以及一种可变项类型:Object。注意,在JavaScript中,数组严格来讲是一种对象类型。
2)JavaScript变量名和函数名区分大小写。变量或函数名中的换位、缺失或大写错误的字符将使浏览器查找不存在的对象,并以引用错误的形式报错( 如:ReferenceError: *** is not defined )。
3)另一个需要注意的语法错误是,所有小括号、方括号、大括号和引号都有一个结束对,不要遗漏了。
4)JavaScript允许使用单引号(')和双引号(“)来声明字符串。注意用的地方,不要过早关闭字符串,否则会导致语法错误。可以使用反斜杠(\)转义字符转义字符串中有冲突的引号。
5)“=”是赋值给变量,“==”是对比值是否相等,“===”是对比值和类型是否都相等,注意不要把这三者用错了。下面的代码就用错了,x被赋值为2,结果永远为true。if语句中的代码块将针对任何y值运行,除非y为falsy。里面的else块实际上不会运行。JavaScript中几乎每一个值本身都计算为true,除了已知的“falsy”值:false、0、“”(空字符串)、NaN、undefined和null。
let x = 1; let y = 2; if (x = y) { } else { }
6)当函数或方法不带任何参数时,在调用它时不要忘记包含空的小括号,否则返回的是“[Function: *** ]” 而不是预期值。如:
function getNine() { let x = 6; let y = 3; return x + y; } let result = getNine();//调用函数时不要忘记小括号!否则返回的是[Function: getNine] console.log(result); //9
7)关于调用函数的问题,还有一个要注意的错误是函数参数的提供顺序不正确。如果参数是不同的类型,例如函数需要数组和整数,这可能会引发运行时错误。如果参数是相同的类型(例如都是整数),虽然不会报错,但是代码的逻辑就没有了意义。要确保以正确的顺序提供所有必需的参数,避免这些问题。
8) 当我们以字符串或数组的特定索引作为目标(以分割或访问段),或者在循环访问它们的索引时,会出现“Off by one errors”错误(有时称为OBOE)。JavaScript索引从0开始,而不是1,这意味着最后一个索引总是比值的length少一。如果您尝试访问与值的length相等的索引,程序可能会抛出“index out of range”相关错误或“undefined”。
let alphabet = "abcdefghijklmnopqrstuvwxyz"; let len = alphabet.length; //错在与项目值的length相等,循环太多 for (let i = 0; i <= len; i++) { console.log(alphabet[i]); } //错在缺少第一个索引值0,循环太少 for (let j = 1; j < len; j++) { console.log(alphabet[j]); } //正确 for (let k = 0; k < len; k++) { console.log(alphabet[k]); }
9)我们在循环中保存信息、递增计数器或重新设置变量时,会有一个问题,即变量何时应该重新初始化,何时不应该?如果意外重置变量用于结束循环的终端条件,会导致死循环。可以使用console.log()打印每个循环周期的变量值,从而发现变量能重置、不能重置相关错误行为。比如,要通过函数得到一个二维数组[[0, 0], [0, 0], [0, 0]] 该如何实现?
错误代码:

function zeroArray(m, n) { let newArray = []; let row = [];//row放在这里初始化会得到错误结果!! for (let i = 0; i < m; i++) { console.log('haha');//看循环的分接处 for (let j = 0; j < n; j++) { row.push(0); console.log(row);//看每一次二维循环后得到的结果,发现当前的row里保存着上一次一维循环后row得到的值。 } newArray.push(row); } return newArray; } let matrix = zeroArray(3, 2); console.log('结果:'); console.log(matrix); /*控制台输出如下所示: haha [ 0 ] [ 0, 0 ] haha [ 0, 0, 0 ] [ 0, 0, 0, 0 ] haha [ 0, 0, 0, 0, 0 ] [ 0, 0, 0, 0, 0, 0 ] 结果: [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ] */
看正确代码:
function zeroArray(m, n) { let newArray = []; //let row = [];//row放在这里初始化会得到错误结果!! for (let i = 0; i < m; i++) { console.log('haha');//看循环的分接处 let row = [];//row放在这里初始化才会得到正确结果!!! for (let j = 0; j < n; j++) { row.push(0); console.log(row);//看每一次二维循环后得到的结果,发现当前的row里保存着上一次一维循环后row得到的值。 } newArray.push(row); } return newArray; } let matrix = zeroArray(3, 2); console.log('结果:'); console.log(matrix); /*控制台输出如下所示: haha [ 0 ] [ 0, 0 ] haha [ 0 ] [ 0, 0 ] haha [ 0 ] [ 0, 0 ] 结果: [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ] */
10)要确保循环语句有一个结束循环的终端条件,然后确保程序块最终能达到终端条件,该条件告诉程序何时跳出循环代码。常犯的错误有两种,一种是从终端条件向错误方向递增或递减计数器变量;另一种是意外地重置循环代码中的计数器或索引变量,而不是对其进行递增或递减。
function myFunc() { //此处终端条件为i<=4 for (let i = 1; i <= 4; i += 2) { console.log("Still going!"); } } myFunc();/*返回: Still going! Still going! */
调试:
console.log(name1);//输出变量的内容值
console.log(typeof name1);//检查变量的数据结构或类型(Boolean, Null, Undefined, Number, String, Symbol(new with ES6),BigInt(new with ES2020),Object(JS中数组和方法都是对象)) console.clear();//清除控制台输出的一切内容。