JavaScript 高级程序设计笔记:基础语法

By 刘志军, 2020-12-07, 分类: JavaScript

JavaScript

这本书一共有900多页,可以直接从第3章46页开始看,这章主要介绍JS的语法基础知识

标识符

1、js中的标识符推荐驼峰大小写形式, 例如:firstName, 第一个单词的首字母小写,后面单词首字母大写。 与python是不一样的,python用下划线表示, first_name。

2、 js的注释与c、java是一样的,单行注释 // 多行注释 / /

3、定义变量需要关键字用 var, let 或者 const 来声明

var、let、const

这3个关键字都是用来声明变量的,现在详细介绍他们各自的用途和特点

var num = 10;

var 关键字声明的变量是局部变量, 如果是函数中定义的变量,函数执行完之后改变量就被销毁。和python 中不同的是, 在函数中用var定义局部变量,可以先引用变量,变量的定义放在后面,例如:

function hello (){
    console.log(age);
    var age = 10;
}

hello();

代码不会报错,也不是打印出10, 而是输出结果 undefined, 这是因为在函数中声明的变量会自动“提升”到该函数作用域的顶部,等价于

functioni hello(){

    var age;
    console.log(age);
    age=10;
}

let 关键字与var作用差不多,区别在于,let声明的范围更小,是块作用域。 所谓块作用域,if,for、while 这些语句块都是块作用域。

if(true){
    let yes="yes";
}
console.log(yes);

这里就会报错提示yes变量没有定义,因为已经超过了if语句块, 如果是var关键字定义,则没有这样的问题。

let 与 var 的另一个区别是,let 声明的变量不会自动提升到作用域的顶部,因此不能先引用再定义。

if(true){
    console.log(yes);
    let yes="yes";
}

这个就会报错 ReferenceError。

var 与 let 的第三个区别, var 在全局作用域中声明的变量会成为window对象的属性, 而 let 声明的变量不会

var name="chrome"
let name2= "ie"

console.log(window.name)   //chrome
console.log(window.name2)  //undefined

const 与 let 相似,作用域也是块级作用域,不同的地方是声明变量的同时必须将变量进行初始化,同时不同给该变量重新赋值,其实就是用来定义常量的。

const num = 4;
num = 6;

上面会报错,因为常量是不能被重新赋值的。

总结一点:优先使用const, let次之, 能不用var就不用var

数据类型

JS中一共有7种数据类型,分别是Undefined, Boolean, String, Number, Null, Symbol 6个简单数据类型 和 Object 这个复杂数据类型。

typeof 操作符可用来检查变量属于何种类型

console.log(typeof 1); // number
console.log(typeof null); //object
console.log(typeof "hello"); //string
console.log(typeof undefined); //undefined
console.log(typeof true); // boolean
console.log(typeof {name: "tou"});  //object

Undefined 类型的数据就一个值叫 undefined, 当 用 var 或 let 声明的变量还没赋值时,这个变量的类型就是undefined

Null类型的值也只有一个null, 表示空对象, 通常如果变量是用于保存对象值时,初始化就可以用null赋值,等真正有了对象值时再重新赋值。

let car = null;
car = {weight:100};
if (null==undefined){
    //
}

undefined 与 null 的表面值是相等的,因为undefined 是从null派生而来的,但是二者的用途有着明显的不同, undefined 就是表示变量尚未初始化, 而null表示变量现在是空值,将来可以用其它对象填充。

Boolean 类型值有true和false, 其它任何类型的数据都可以通过函数 Boolean()转换为Boolean类型的true或者false,在 if 条件语句中,javascript会自动将该数据转换为对应的Boolean类型的值。

微信截图_20201127012728.png

Number类型分为整型和浮点型,和其它语言基本是一样的, Number类型中还有3个特殊的值, NaN ,Infinity, -Infinity ,后面两个好理解,无穷大和负无穷大。 NaN 表示“不是数”,"不是数"是个特殊数,比如 0/0,其它语言直接报错, 而在JavaScript中,他会返回NaN值.

console.log(0/0); //NaN
console.log(5/0);  //Infinity
console.log(-5/0);  //-Infinity

NaN 与任何值比较都不相等,即使与NaN比较也不相等

console.log(NaN==NaN) //false

判断一个值是否可以转换为数值类型可以用函数isNaN(), 返回false 就可以转换

console.log(isNaN("10")); // false , 可转换为10
console.log(isNaN("red")); // true 不是数值,不能转换
console.log(isNaN(true));  //false , 可转为1

将其它类型值转换为数值类型有三个函数, Number(), parseInt(),parseFloat()。 Number 函数可将任何类型的值转换为数值, 后两个主要是用于将字符串转为数值。

console.log(Number("red"));  //NaN
console.log(Number(true));  //1
console.log(Number(false));  //0
console.log(Number(""));   //0
console.log(Number("10"));  //10
console.log(Number(undefined));  //NaN
console.log(Number(null)); //NaN

对于对象,先调用对象的valueOf方法,如果是NaN,再调用对象的toString方法。

console.log(parseInt("12xxx"));   //12
console.log(parseInt(""));  //NaN

parseInt 默认按10进制转换, 也可以指定进制

console.log(parseInt("10", 2)) //2
console.log(parseInt("10", 8)) //8
console.log(parseInt("10", 10)) //10
console.log(parseInt("10", 16)) //16

String

javascript 中的字符串可以使用双引号(")、单引号(')或反引号(`)标示。

javascript中除了null和undefined之外的值都有一个toString()方法,可以将其转换为字符串。当你不确定变量是否为null或undefined的时候,又需要调用toString()方法时,怎么办?可以先调用 String()转型函数,将其装换为复杂数据类型Object

let a;
console.log(a.toString()); // 报错
console.log(String(a).toString());  //undefined

反引号组成的字符串主要用途是模板字面量,主要用在html模板中,例如:

let value = "world";

let content = `
    <html>
        <body>
            <div>
                hello  ${value}
            </div>
        </body>
    </html>
`

symbol

暂时不做了解

Object类型

let obj  = new Object();

Object 是其他所有对象的基类, 都有如下属性和方法

操作符

等于与不等于 (==)与 (!=) 会先进行强制类型转换,再做相等性比较,例如:

console.log("22"==22) //true

全等与不全等(===)与(!==) 不会进行类型转换

console.log("33"===33);  //false

在做相等性判读时推荐使用后者。

语句

do{
    console.log(i);
}
while(i++<10);

for in 语句,用于迭代变量中的元素,迭代的变量可以是任意对象,包括null 和 undefined。

for(const name in window){
    console.log(name);
}

for of 也是用于迭代,不过他是更为严格的迭代,变量必须是可迭代的,如果是null就不行。其实window也不是可迭代对象,所有也会报错,可迭代对象都必须有一个next()方法。

for(num of [1,2,3,3,4]){
    console.log(Math.pow(num, 2))
}

with 语句

将代码作用域设置为特定对象, 例如:

console.log(location.href);
console.log(location.hostname);
console.log(location.search.substring(1));

// 用with代替,

with(location){
    console.log(href);
    console.log(search.substring(1));
}

switch case 语句 用于替换大量的if else if 的场景

let i=0;

switch(i){
    case 1:
        console.log(i);
        break;
    default:
        console.log("other");
}

函数

函数没有显式的return时,返回的是 undefined 对象。


有问题可以扫描二维码和我交流

关注公众号「Python之禅」,回复「1024」免费获取Python资源

python之禅

猜你喜欢

2021-09-21
Javascript 中,相等操作符两等号“==”与三等号 “===” 有什么区别?
2021-05-13
python和javascript中的round函数区别
2020-12-08
JavaScript高级程序设计读书笔记二:变量与作用域
2020-12-08
JavaScript高级程序设计读书笔记三:基本引用类型