js红宝书笔记-第三章

第三章 语言基础

1.1 语法

ECMAScript 的语法借鉴了C 语言和其他类C语言,如Java

  • 区分大小写,变量 aA 不同
  • 标识符,变量名、函数名、参数名等一切你可以命名的东西的名称就是标识符,由字母、下划线(_)、$ 开头,后续字符可以是以上加上数字,关键字与保留字不能作为标识符
  • 语句以分号(;)结尾,语句结束最好加上

推荐驼峰命名法,首字母小写,后面每个单词的首字母大写

不以 ; 结尾有时不会报错,但代码规范最好加上

1.2 严格模式(推荐使用)

使用严格模式会更加严格检查代码,不规范的写法也序原本可以运行,但在严格模式下会报错,需要在脚本开头加上一串字符

"use strict";

也可也只对函数使用严格模式

function fuckingJs() {
	"use strict";
	console.log("卷心菜yst");
}
2.1 变量

js 的变量可以保存任何类型,可以是数字,字符,数组,对象等,有三个关键字可以声明变量

var(最好不用)

函数内是是函数作用域范围,变量出函数死亡,全局内是全局作用域范围变量声明会提升。同一个域可重复声明,因为提升时会合并为一个声明

//案例一 了解作用域
fuction a(){
	var yst= "卷心菜";
}
console.log(yst);				//报错,因为出了函数作用域

for(var i = 0;i < 3;i++){		//这里的for循环不是函数,所以 i 与 yst 都是全局的
	var yst = i;
}
console.log(i);					//3
console.log(yst);				//2
//案例二 了解变量提升
var a = "卷心菜";
var a = "yst";
//以上代码等同于
var a;
a = "卷心菜";
a = "yst";
//案例三 了解作用域与变量提升
if(true){
	var name = "卷心菜yst";				//这是一个全局变量,因为if(){}不是函数
}
console.log(name);						//卷心菜yst
//以上代码等同于
var name;
if(true){
	name = "卷心菜yst";
}
console.log(name);						//卷心菜yst

需要注意的是函数式的 fuction 的声明也会提升,且在变量提升位置之前

需要注意的是全局作用域下用 var 声明的变量会成为 window 对象的属性

let(推荐使用)

块作用域范围,变量出花括号{})死亡。变量会提升,所以变量声明之前不能使用,这块地方叫暂时性死区。同一个域内不能重复声明

{//这是一个块,也可以是if语句的块内,也可以是函数块内等
	console.log("yst");		//报错,暂时性死区
	let yst = '卷心菜";
	console.log(yst);		//卷心菜
}
console.log("yst");			//报错,作用域外

需要注意的是 letvar 重名也会报错

const(推荐使用)

let 基本一致,但是赋值后值无法改变,但是如果保存的是对象可以修改,因为保存的是对象地址,地址并没有被改变

const a = 1;
a = 2; 					// 报错,给常量重复赋值
const yst = {};
yst.name = '卷心菜'; 	// ok

需要注意的是在严格模式下,给一个没有声明的变量赋值 a = 1,则会导致抛出 ReferenceError

3.1 数据类型

js6 种简单数据类型,数据直接存储在内存空间,与 1 种复杂数据类型object 对象类型

undefined

简单数据类型为空时推荐赋值为 undefined,所有已经声明但是未被赋值的变量会默认赋值 undefined 函数没有返回值默认返回 undefined

null

对象数据类型为空时推荐赋值 null

boolean

值为 truefalse ,区分大小写,TrueFalse是标识符而不是布尔值

需要注意的是 boolean 类型的值 虽然只有 truefalse 两个值,但是其他类型的值可以等价转换为 boolean 类型,可以使用 Boolean() 转型函数,也可也使用 if() 语句自动转换
string 非空字符串为 true,空字符串为 false
number0true0NaNfalse
object 任意对象为 truenull 空指针对象为false
undefined 都是 false

string

字符串,可以使用双引号")、单引号')或反引号(``),是不可变的。一旦创建要修改只能开辟一块新空间销毁原来的

  • 转换为字符串
    3 种方法可以转换为字符串
    • value.toString() 转换 nullundefined报错
    • value+"" 这种方法的可读性很差
    • String(value)(推荐)

义字符只占一个字符长度 \n

number

数字,使用双精度浮点类型,相当于 java 中的 double,不区分浮点型和整数型 ,可以使用 281016进制,但是 8 进制在严格模式下会报错,由于精度问题会导致许多错误如 0.1+0.2!=0.3

2进制 0b 开头
8进制 0开头
10进制
16进制 0x开头

Number.MIN_VALUENumber.MAX_VALUE 保存 number 的最小最大值。 如果计算时超出范围返回 -infinity+infinity

  • NaN
    NaN (not a number) 不是数值的数字类型 ,本应该返回数字,但是计算失败而返回不正确的数字返回值,使用 typeof 也是返回 number

  • 转换为数字
    3 个函数可以将非数值转换为数值

    • Number()
    • parseInt() 第二个参数确定为几进制 parseInt("0xAF", 16);
    • parseFloat()

需要注意的时 NaN 进行任何运算都是返回 NaNNaN 不等于任何值包括本身 NaN != NaN,判断是否是 NaN 需要调用专门函数判断 isNaN()

symbol

符号,无论如何不会重复,独一无二的值。,一般用于创建对象的键,不使用 new 关键字初始化,后续详细深入

const symbol = Symbol('描述') // Symbol(描述)描述可以不加
object

表示值为对象(而非函数)或 null,推荐使用 let o = {} 初始化,key 可以也通常不加引号,除非时特殊符号

const yst= {
  name: '卷心菜'
}
const obj = {
  '@@': '卷心菜' // 正常
}
3.2 typeof操作符

会返回操作值数据类型的字符

console.log(typeof 1);			//1

需要注意的是 null 会返回 object字符,因为 null 实际上对空对象的引用,函数会单独返回 fuction 字符串,函数本来应该是 object 类型,但是函数有自己的特殊性

已经声明但没有赋值,与未声明的变量有本质区别
对以上两种情况使用 typeof 都是返回 undefined
undefined 是一个假值,空字符串 ‘’ ,null 都是假值
undefinednull 派生 undefined == null

3.3 模板字面量(ES6

反向单引号 (``),可以声明跨行字符串,严格来讲它不是一个字符串声明模式,而是一个特殊的 JavaScript 表达式,返回值为一个字符串,并且在定义时立即求值并且转换为字符串实例

let yst = `
这是
跨行
`
模板字面量插值

在模板字面量中使用 ${},实际字符串返回时会计算该插槽中的表达式并且强制转换为字符串

let yst =`我是${1+2}`;//等同于
let yst ="我是"+(1+2);
标签函数

可以对模板字面量里的插值提取出来这次操作,比如把里面的变量再次提取出来变成可以点击的链接

let a = 6;
let b = 9;
function tagFunction(c,d,e,f){
console.log(c);
console.log(d);
console.log(e);
console.log(f);
}
let yst= tagFunction`${a} + ${b} = ${a+b}`;
//输出为
//[""," + "," = ",""]
//6
//9
//15
let book = [
	{author:"yst"},
	{author:"卷心菜"}
];
function template(){	//将模板里面的变量yst替换成为链接	
	return `<ul>
		${book.map(item=>links`<li>作者:${item.author}</li>`)}
		<ul>`;
}
function links(strings,...vars){
	return strings.map((str,key)=>{
		return str + (vars[key]?vars[key].replace("yst",`<a href="https://www.yst.com">卷心菜</a>`):"")
	}).join("");//不然会以,作为分隔符
}

若使用 String.raw 作为模板字符串的前缀,则反斜线不再是特殊转义字符,\n 也不会被解释成换行符:

let raw =String.raw`Not a newline: \n`;
console.log(raw ==='Not a newline: \\n');// true
4.1 操作符

java 写法 ++ -- ^ ! = * / % 等等

5.1 语句

java 写法 if else do while for switch withwith严格模式报错) 等等

需要注意的是 for in 用于遍历对象 for of 用于遍历集合
switch 里的等式是 === 不会进行隐式转换

6.1 函数

java 写法,不需要指定是否返回值,可以省略 return

// 定义函数sayHi()
function sayHi(name, message) {
	console.log("Hello " + name + ", " + message);
}

// 调用函数sayHi()
sayHi("Nicholas", "how are you today?");

严格模式下
不能以evalarguments 作为名称
参数不能叫evalarguments
两个命名参数不能拥有同一个名称

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷心菜yst

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值