## 索引 [TOC] ###let 和 var关键字的区别 let 和 var 都是 JavaScript 中用于声明变量的关键字,但它们在作用域、变量提升(Hoisting)和重新声明等方面有所不同: #### 作用域: var 关键字声明的变量具有函数作用域(在ES6之前),也就是说,在同一个函数内部,它在整个函数体内都是可见的,而在函数外部则为全局作用域。 let 关键字声明的变量具有块级作用域,这意味着变量在其所在的代码块内有效。比如在 {} 内部定义的 let 变量只能在这个大括号范围内访问到,出了这个范围就无法访问了。 #### 变量提升(Hoisting): var 声明的变量会被提升到其所在作用域(函数或全局)的顶部,即使声明语句位于代码块的后面,也可以在声明前使用该变量,值为 undefined。 let 声明的变量不会被提升到整个作用域的顶部,而是存在“暂时性死区(Temporal Dead Zone, TDZ)”,在声明前试图访问 let 变量会抛出 ReferenceError 错误。 #### 重复声明: 在同一作用域内,多次使用 var 声明同一个变量是允许的,并不会报错,只会覆盖前面的声明。 使用 let 声明变量时,在相同的作用域内不允许重复声明。如果尝试在同一作用域内再次用 let 声明同一个变量名,JavaScript 会抛出 SyntaxError 错误。 #### 循环中的区别: 在for循环等场景中,var 往往会导致闭包问题,因为每次迭代都会重用相同的全局变量。 let 则会在每次循环迭代时创建一个新的独立变量,解决了这类循环内的作用域问题。 ####绑定对象属性: 使用 var 声明的全局变量会成为全局对象(如浏览器环境下的 window 对象)的属性。 使用 let 声明的全局变量不会自动变成全局对象的属性,它依然保持块级作用域特性。 总结起来,let 的引入增强了 JavaScript 的作用域控制能力,降低了因变量作用域和提升机制带来的潜在错误,并提供了更精确的变量生命周期管理。从 ES6 开始推荐使用 let 和 const 替代 var 来声明变量,以提高代码质量与可维护性。 ------------ ### 数据类型 #### Undefined类型 所有Undefined类型的输出值都是undefined。当需要输出的变量从未声明过,或者使用关键词var声明过但是从未进行赋值时会显示undefined字样 #### Null类型 null值表示变量的内容为空,可用于初始化变量,或者清空已经赋值的变量。 #### String类型  #### Number类型 在JavaScript中使用Number类型表示数字,其数字可以是32位以内的整数或64位以内的浮点数。  #### Boolean 布尔值(boolean)在很多程序语言中都被用于进行条件判断,其值只有两种:true(真)或者false(假)。 ------------ 检测变量的数据类型 ```js typeof(); //使用 console.log 输出 typeof()的值 console.log(typeof()); ``` ------------ ### 2024-03-12 ```js /* 位置对照 hello worl d ! 0123456789 10 11 */ let str="hello world!"; //12 个字符 /* 这是JavaScript的一个历史遗留问题, 实际上在最新的ECMAScript规范中, typeof null 的结果仍为 "object", 尽管 null 不是一个真正的对象实例。 */ console.log(typeof(null));//object //定义变量但是未赋值的情况 返回 Undefined let x; console.log(x);//undefined // 获取字符串长度 console.log(str.length);//12 // 字符串的开始位置(0)向后搜索(从左往右) console.log(str.indexOf("w")); //6 // 它从字符串的结束位置向前搜索(从右往左) console.log(str.lastIndexOf("w")); //6 // 从起始搜索位置 向后搜索(从左往右) console.log(str.indexOf("w",1)); //6 // 从起始搜索位置 向前搜索(从右往左) console.log(str.lastIndexOf("w",8)); //6 // 从起始搜索位置 向后搜索(从左往右) console.log(str.indexOf("e",2)); //未找到返回-1 // 截取一段字符 包左不包右 (起始位置,结束位置) console.log(str.substring(3,12)); //lo world! console.log(str.slice(0,4));//hell console.log(str.slice(2));//llo world! // 截取(位置)上的单个字符 console.log(str.charAt(3)); //l // 获取(位置)上的 ASCII 码 console.log(str.charCodeAt(3)); //108 //拼接字符串 console.log(str.concat("javascript")); //hello world!javascript console.log(str+"hi xiaohu"); //字符替换 console.log(str.replace("world","MySQL"));//hello MySQL! //转换小写 console.log(str.toLowerCase());//hello world! //转换大写 console.log(str.toUpperCase());//HELLO WORLD! //全局搜索(/g) hello //RegExp 对象:https://runoob.com/jsref/jsref-obj-regexp.html console.log(str.match(/hello/g)); //(1) ['hello'] //全局搜索(/g)xiaohu console.log(str.match(/xiaohu/g)); //未找到返回:null console.log(str.search(/h/g,"A"));//0 // 3*(10的4次方) console.log(3e4);//30000 // 3*(10的-4次方) console.log(3e-4);//0.0003 // 十六进制 console.log(0xa);//10 // 八进制 console.log(010);//8 //浮点数 0.3 0可以省略 console.log(0.3)//0.3 console.log(.3)//0.3 //保留小数 let num=3.1415926; console.log(num.toFixed(3)); /* 使用浮点数进行计算,有时会产生误差 表达式使用的是十进制数,但是实际的计算是转换成二进制数计算再转回十进制结果的,在此过程中有时会损失精度。 */ console.log(0.7+0.1);//0.7999999999999999 //解决办法:两个加数都乘以10进行计算后再除以10还原。 console.log((0.7*10+0.1*10)/10); /* Infinity表示无穷大的含义,有正负之分。 当数值超过了JavaScript允许的范围 就会显示为Infinity(超过上限)或-Infinity(超过下限) */ console.log(9e30000);//Infinity /* 数字比较大小时,无论原数据值为多少, 结果为Infinity的两个数认为相等, 而同样两个-Infinity也是相等的 */ let x1 = 3e9000; let x2 = 9e3000; console.log(x1==x2);//ture /* 正数除以0返回值就是Infinity, 负数除以0返回值为-Infinity, 特殊情况0除以0的返回值为NaN(非数字) */ console.log(1/0);//Infinity console.log(-1/0);//-Infinity console.log(0/0);//NaN /* Infinity不可以与其他正常显示的数字进行数学计算 Number.POSITIVE_INFINITY 是一个特殊的数值常量,表示正无穷大 进行非法数学运算,例如 0 / 0 或者 Infinity - Infinity 等操作时,才会返回 NaN(Not a Number) */ let Inf=9e3000; console.log(Number.POSITIVE_INFINITY+3);//Infinity console.log(Inf);//Infinity console.log(Inf-Inf);//NaN //数据类型转换 String to Number let str1="1",str2="a"; console.log(Number("1"));//1 // 使用 isNaN()查询变量是否可以转换为 Number类型 console.log(isNaN(str1));//false console.log(isNaN(str2));//true /* 转义字符 \n表示换行 \t 制表符 \b 空格符 \r 回车符 \f 换页符 \0nnn nn表示字符 八进制 n 是 0-7 range:000-037 \xnn 十进制 n 是 0-f range:00-ff \unnn 十六进制 n 是0-f */ console.log("hello world\nhello javascript\thello mysql"); console.log("\"hello xiaohu\"")//"hello xiaohu" console.log("\'xiaohu\'");//'xiaohu' console.log("\\xiaohhu\\");// \xiaohu\ console.log("\/xiaohu\/");// /xiaohu/ console.log("\//xiaohu\//");// //xiaohu// console.log("\\\\xiaohu\\\\");// \\xiaohu\\ /* hello world hello javascript helllo mysql */ // Boolean ture or false console.log(1>2);//false console.log(1<2);//true ``` ------------ ### JavaScript RegExp 对象(正则表达式) https://tongyi.aliyun.com/qianwen/share?shareId=c5a169da-058b-44eb-bdde-d6abee16b0cf #### 2024-03-19 一、 布尔值和数字转换为字符串: 1、 将布尔值false转为字符串,在控制台打印输出结果 2、将数字300分别转换为二进制、八进制和十六进制数,在控制台打印输出结果 二、字符串转换为数字: 1、将字符串“3.14.15”分别转换为整数型和浮点型数字 三、强制转换 1、分别将null,undefined,50,0,“”,“hello”转换为布尔值,在控制台打印输出结果 ```js ``` ``` let r=2.5 let c=Math.PI*2*r//周长 let s=Math.PI*r*r//面积 let v=(4/3)*Math.PI*r*r*r//体积 console.log(s.toFixed(2),c.toFixed(2),v.toFixed(2)) let fruit = ["apple","banana","orange","pear","pineapple"] console.log(fruit) var date=new Date() var week=["日","一","二","三","四","五","六"] console.log("今天是"+date.getFullYear()+"年"+(date.getMonth()+1)+"月"+date.getDate()+"日"+"星期"+week[date.getDay()]) let ticket = new Object() ticket.name="你想活出怎样的人生" ticket.time="2024.03.04" ticket.price=20 ticket.seat=10 console.log(ticket) ``` ```js ``` ##### switch 星期 ```js let a =new Date().getDay() // let n=a.getDay() switch(a){ case 0: console.log("星期天") break; case 1: console.log("星期1") break; case 2: console.log("星期2") break; case 3: console.log("星期3") break; case 4: console.log("星期4") break; case 5: console.log("星期5") break; case 6: console.log("星期6") } ``` ##### 99乘法表 ```js for(let i=1;i<=9;i++){ for(let j=1;j<=9;j++){ console.log(i+"x"+j+"="+i*j) } } ``` ### 转义字符  最后修改:2024 年 05 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏