整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript ECMAScript语法概括「

JavaScript ECMAScript语法概括「思维导图」


avaScript ECMAScript语法思维导图见文章底部


JavaScript是什么 ?

  • JavaScript是一门脚本语言
    脚本语言:不需要编译,直接运行(js,python...)
    编译语言:需要把代码翻译成计算机所认识的二进制语言,才能运行(c,c++,java...)
  • JavaScript是一门基于对象的语言
    基于 而不是 面向
    JavaScript可以模拟其他语言的特性(封装、继承、多态)
  • JavaScript是一门动态类型的语言
  • JavaScript是一门弱类型的语言
  • JavaScript是一门解释性的语言

JavaScript能做什么?

  • 前端开发
  • 后端开发
  • 底层
  • 操作系统开发
  • 大数据
  • 区块链
  • 人工智能
  • ... js无所不能

引入js的两种方式

  • 内联
    在html中 body标签内的最下方通过script标签 编写js代码
    <script>var a=1;</script>
  • 外联
    引入外部文件 在html中 body标签内的最下方通过script标签的src属性引入文件
    <script src="./index.js"></script>

为什么要有变量?

为了存储和复用一个数据,方便修改

当声明一个变量的时候 var a=10 ,会在内存中开辟以一个空间 存放变量名和变量值 ,会将变量和值存放到window对象中 a:10


1. 全局变量

全局作用域中的变量 可以在该脚本文件中的任何地方访问到

2. 局部变量

局部作用域中的变量 局部变量只能在该函数中访问到

注意

在局部作用域中(函数中)声明变量 如果未加关键字 var || let || const 这个变量就会变为隐式全局变量

function a(){
  num=1;
}=>
var num;
function a(){
  num=1;
}
/*只有num1 是局部变量 , num2 和 num3 是隐式全局变量*/
function a(){
  var num1=num2=num3=100;
}=>
var num2;
var num3;
function a(){
  var num1=100;
  num2=100;
  num3=100;
}

JavaScript代码规范以及变量命名

声明关键词 var let const 变量名区分大小写

命名规范

一般以字母、$、下划线、数字组成(不能以数字开头) 不能使用系统关键词和保留字 一般遵循驼峰命名法(第一个单词首字面小写后面单词首字母大写) 变量名需得有意义


预解析

JavaScript在执行的过程中,浏览器的js引擎会将代码扫描一遍(预解析) 并把 **声明式** 函数 和 变量 提升到 **该作用域** 的最顶端

1. 变量预解析

变量预解析只会将变量的声明提升到该作用域的最前面

console.log(a) // undefined
var a=10;=>
var a 
console.log(a) // undefined
a=10 

2. 函数预解析

变量预解析只会将变量的声明提升到该作用域的最前面

b()
function b(){
}=>
function b(){
}
b()

断点调试

直接在浏览器中Sources添加断点 或者在编辑器中在语句之后添加 debugger




数据类型


什么是数据类型?

计算机里面有很多数据,JS为了方便调试与使用,提供了一些对应的辅助方法,将它们做了归类,就是数据类型。


简单数据类型


1. Number

1.1. 整数=> 正数 负数 1.2. 小数 1.3. NaN Not a Number=> 不是一个数字 判断一个数字是否是非数字isNaN(x) 返回布尔值 true是一个非数字,false不是一个非数字

isNaN(undefined) // true
isNaN(null) // false

NaN不等于任何值,包括它自己

  • 数值的取之范围
Infinity // 无穷大
-Infinity // 无穷小
Number.MAX_VALUE /*最大值*/
Number.MIN_VALUE /*最小值*/
  • 运算符
    算数运算符

+:加

-:减 *:乘 /:除 %:求模 任何数除以0为无穷大 任何数-*/%字符串为NaN (除了+)

复合运算符

+=<a+=1=> a=a+1> -=<a-=1=> a=a-1> "=" <a=1=> a=a*1> (乘等于) /=<a/=1=> a=a/1> %=<a%=1=> a=a%1>=====两个等于和三个等于的区别 两个等于只对比值 三个等于对比值和数据类型

自增自减运算符 a++ ++a a-- --a

  • 前置自增 ++a 先运算、再返回
  • 后置自增 a++ 先返回、再运算

2. String

2.1 字符串的长度str.length 2.2 字符串加号运算 会将数据与数据拼接字符串 + 任何数据类型=拼接之后的新的字符串


3. Boolean

true=> 1 false=> 0

用布尔值来判断条件真假


4. Undefined

未定义


5. Null


  • undefined和null的区别

null 表示一个值被定义了,定义为null undefined 表示一个值声明了 但是未定义(未赋值) 所以设置一个值为null是合理的 设置一个值为undefined是不合理的 null==undefined // true null===undefined // false 说明 null 和 undefined 在转boolean 的时候都为 0 值相同 所以==为true ,数据类型不一样===为false


复杂数据类型


1. Array

  • 创建数组的方式

new

new Array()
new Array(初始长度)
new Array( 1 , 2 , 3 )

字面量

[ ]
[ 1 , 2 , 3 ]
  • 数组的三个概念

元素: 数组中的值就是元素 下标(索引): 下标从0开始 长度: length 数组的长度 从1开始

  • 遍历数组

正叙遍历

for(let i=0; i < arr.length; i++){
  /*代码块*/
}

倒叙遍历

for(let i=arr.length; i > 0; i--){
  /*代码块*/
}
  • 栈和队列操作

栈操作 先进后出

arr.unshift() /*从头部放入*/
arr.shift() /*从头部取出*/
arr.push(); /*从尾部放入*/
arr.pop(); /*从尾部取出*/

队列操作 先进先出

arr.unshift() /*从头部放入*/
arr.pop(); /*从尾部取出*/
arr.push(); /*从尾部放入*/
arr.shift() /*从头部取出*/

2. Function

  • 函数的声明

声明式创建函数

function fn (){
  //代码块
}

匿名方式创建函数

let fn=function(){
  //代码块
}

函数对象

let fn=new Function("形参","形参","代码块") /*前面的都是参数,最后面的参数是代码块*/
  • 函数的默认值
    形参默认值 形参=形参 || 默认值
  • 函数的调用
    函数名(实参列表)
  • return 关键字

函数中 return 将数据给调用者 函数中遇到 return 直接跳出函数 后面代码不执行 函数默认 return undefined

  • 函数的预解析

只有声明式的函数和变量才会预解析 先调用 -> 后声明 在js执行的时候 浏览器会执行 预解析的操作

预解析会把所有的 声明式 创建的函数(包括变量) 提升到当前作用域的最顶端

  • 回调函数 函数作为参数传递 函数作为返回值
  • arguments 属性

函数内部的特殊属性 用来保存实参列表 arguments 是一个 伪数组=> 不是数组 但是具有数组的特性(下标索引、长度、可以进行循环遍历) 可以模拟函数重载=> 同一个函数,因为传递的实参数量不同,可以执行不同的操作

  • 工厂函数 和 构造函数
/*工厂函数*/
function createStr(name,age){
  let obj=new Object()
  obj.name=name
  obj.age=age
  obj.sayHi=function(){
    console.log(this.obj)
  }
  return obj
}
let obj1=createStr("蓝海",11)
/*构造函数*/
function StuInFo(name,age){
  this.name=name
  this.age=age
  this.sayHi=function(){
    console.log(this.obj)
  }
}
let obj2=new StuInFo("蓝海",11)

构造函数相对于自定义类(class) 1.变量名一般用名词,首字母大写 2.构造函数中 不需要我们去创建对象、返回对象 3.构造函数一般 被 new 关键词调用

new 关键字 做的四件事

创建空对象 将空对象 传递给 构造函数 里面的 this 调用构造函数 返回对象

  • 自调用函数

声明的时候直接调用执行

(function("形参列表"){
  /*代码块*/
})("实参列表")
  • 函数内存存放
    函数名存放在栈里面
    通过内存地址相关联
    函数体和形参列表存放在堆里面

3. Object

  • 创建对象的方式

new

let obj=new Object()
||
let obj=new Object({
  name : "蓝海",
  age : 11
})

字面量

let obj={ }
||
let obj={
  name : "蓝海",
  age : 11
}
  • 访问对象中的属性
    对象.属性
    对象["属性"]=> 注意 用中括号的方式访问对象中的属性 属性名?加引号
    访问对象中不存在的属性=> undefined
  • 对象属性操作
    添加属性=> 直接对象 . 属性名=属性值
    删除属性=> delete 对象 . 属性名 || delete 对象 . 方法名
  • 判断一个对象中是否存在某个属性或某个方法
    "属性" in 对象=> "name" in obj
  • 对象中的 this

对象中的this就是这个对象 可以通过this.属性名 在对象的方法中访问对象里的其他属性或方法

  • 对象内存存放
    对象名存放在栈里面
    通过内存地址相关联
    对象里面的方法和属性存放在堆里面

获取数据类型

1. typeof

typeof检查简单数据类型[值类型] 返回的是 字符串类型的数据类型

typeof(123)=> "number"
/*注意点*/
typeof(typeof(123))=> "string"
typeof(null)=> "object"
typeof(Infinity)=> "number"
typeof(NaN)=> "number"
typeof(new Date())=> "object"=> /*typeof检查其他new出来的对象 都返回 object*/
/*typeof() 复杂数据类型object、array 和 null 都返回 object
  typeof(function)=> function // 函数除外
*/

2. instanceof

instanceof检查复杂数据类型[引用类型] 返回boolean值

数据名 instanceof 数据类型 /*[Function||Object||Array]*/
返回 false 或 true
只能检查复杂数据类型 简单数据类型都返回false

typeof 和 instanceof 的区别

typeof用来检测简单数据类型 返回值是一个字符串的数据类型 instanceof用来检测复杂数据类型 返回的是boolean值 如果用来检测简单数据类型都会返回false


数据类型转换


1. 转换为字符串

str.tostring() 默认模式把变量转换为字符串 || 基模式 String(str) 把特殊值转换为字符串 String(undefined)=> “undefined” 加号拼接字符串

2. 转换为数组

parseFloat(str) 把字符串转换为浮点数(小数) parseInt(str) 把字符串转换为整数

{Number(str) 任何数据转换为整数

如果字符串截去开头和结尾的空白字符后, 不是纯数字字符串,那么最终返回NaN。 如果字符串中只包含了数字,(包括前面带正号和负号), 则将其转换为十进制数值,即"1"->1,”011“->11 如果字符串是空的""则返回0 如果字符串包含除了上面的格式之外的字符,则将其转换为NaN

boolean  true转换为1 false转换为0
null 返回 0
undefined 返回 NaN

}

3. 转换为布尔值

Boolean()

将布尔字符串转成布尔值 除了 0、false 、undefiend、NaN、null 转换为false 其他都为true

4. 转义符

console.log("转义符的应用\"嗯") ->[转义符的应用“嗯] 常用

  • \n 换行符
  • " 双引号
  • ' 单引号
  • \ \ 斜杠\

JavaScript内置对象

戳一下 之前总结的常用内置对象博客


条件判断

一些很简单条件判断这里就不说了哈

1. 三元运算符

条件 ? true : false

2. switch-case

/*相对于 if (a===1) 用来做全等判断*/
break /*每个case里面的代码断都要写 break 否则会穿透*/
/*合理使用switch穿透 <当多个case要执行的代码需求一样的时候>*/
default /*如果case都不匹配的情况下 会执行 default 里面的代码*/

3. && || !

&& 与 一假则假 || 或 一真则真 ! 非 取反


循环


1. for

for 循环体上面的 i 变量的作用域是全局作用域 如果在函数中使用就是局部作用域 一般建议使用let 关键词来声明 i

for (let i=1;i < 10; i++){
  /*代码块*/
}
/*拆解为*/
let i=1;
for(;i<10;){
  /*代码块*/
  i++;
}

2. do while

先执行do里面的代码块 再条件判断

do{
  /*代码块*/
}while(boolean)

3. while

先条件判断 再执行代码块

while(boolean){
  /*代码块*/
}

do-while 与 while 的区别

do-while 不管条件是否成立 都会执行一次do里面的代码块 然后再进行条件判断 while 先进行条件判断 再执行代码块

3. for in

遍历对象

for(let "属性名" in "对象"){
  /*访问对象中的属性或方法*/ /*这里的属性名已经是string类型 所以无需再加引号*/
  obj[name]=> /*对象[属性名]*/
}

break 和 continue 的区别

break 跳出整个循环 后面的循环不再执行 continue 跳出本次循环 继续执行后面的循环


xmind知识导图

总结

若有感兴趣的小伙伴,需要JavaScript ECMAScript语法思维导图原图的,关注我,私信回复获取:ECMAScript语法思维导图


作者:蓝海00
链接:https://www.jianshu.com/p/5a5fb2b78d13

者:杨朝清

近日,针对网友“大理洱海步道电动车租赁年龄限制60岁太低、希望放宽”的建议,云南大理市洱海管理局回应称,将认真调研此问题,配备由专职工作人员驾驶的观光车、酒吧车等。

应当说,涉事企业限制骑行年龄,是基于风险防范。一方面,出于骑行安全的考虑,国内大多数城市(包含大理市)在城市标准道路上行驶、运营的共享电动车高龄限制为65周岁;另一方面,由于该步道游客行人多、路况复杂,且部分路段弯道较多、多数路段临靠湖边不具备安装护栏条件,对骑行用户的车辆操控反应、身体素质要求更高,“骑行限制60周岁以下”隐伏着良苦用心。

但一项为游客着想的举措,为何会遭遇批评质疑?风险防范没有原罪,却也要把握好尺度。伴随着生活品质的优化、医疗卫生的改善以及全民健康意识的提升,不少人即使年龄过了60周岁被贴上了“老年人”的身份标签,也依然有着较好的身体素质。

早在2020年10月,公安部门就放宽小型汽车驾驶证申请年龄,取消70周岁年龄上限。对70周岁以上人员考领驾驶证的,增加记忆力、判断力、反应力等能力测试,保证身体条件符合安全驾驶要求。“骑行限制60周岁以下”虽然初衷良善,但方法僵化、在操作过程中不够人性化,最终导致效果不尽如人意。

“骑行限制60周岁以下”不仅让游客的利益诉求没有得到满足,也让其权利与尊严受到了损害。害怕承担责任、担心摊上事儿,让一些地方戴上了“有色眼镜”,对老人群体另眼相看。

打破年龄歧视,关键在于减少商家的后顾之忧,通过专门的责任保险实现商家、消费者和保险公司的良性互动,实现三方风险共防、责任共担,以降低商家的压力与风险。让商家轻装上阵,他们才会更有底气和勇气来接纳老人群体。在做好风险防范的同时,商家也要为老人群体提供更加差异化、精准化、个性化的服务,赢得他们的青睐。

在老龄化趋势之下,“银发经济”成为一座市场富矿。只有兼顾多元主体的利益诉求,“骑行限制60周岁以下”的人为藩篱才会被打破。更进一步说,建设老年友好型社会,不仅需要公共部门的“制度补血”和社会层面的尊老敬老,也需要市场力量融入其中,让老年人被温柔相待。

每一个人都终将老去,老年人的需求不能被忽略和漠视。树立和培育积极的老龄观,以积极的态度、政策、行动应对人口老龄化。当尊重和善待老年人蔚然成风,老年人的美好生活才会“有爱无碍”。(杨朝清)

来源: 光明网-时评频道

024年8月1日,正是贵阳市小学新生入学报名的时候,家长们到学校依次排队等待老师审核报名资料。

突然,一名黑衣男子向正在审核资料的老师跪了下去,嘴里不停说道:“不要报警、不要报警......”然而,老师并没有理会这名男子的请求,随即拨通了报警电话。男子见势不妙,起身迅速逃离了现场。

接到报警后,西湖路派出所民警立即赶到学校,原来黑衣男子所带来的报名资料有假!

民警仔细核实,这男子带的户口簿是西湖路派出所的“高仿版”。虽然极其相似,但一些体现在户口簿上的工作细节是仿不出来的。

图丨假户口本

民警再对该男子带来的所有资料进行核实,发现皆是伪造。

后调取学校监控溯源排查,入学报名的这段时间里,黑衣男子常到南明、云岩、观山湖、花溪、清镇等地的学校周边出入。

侦查民警开始着手调查,却发现该男子居无定所、行踪飘忽。侦查民警遂分组到各个学校周边蹲守,伺机出击。

8月2日,在花溪区一小学,黑衣男子又出现在排队的家长中,民警迅速出击,将黑衣男子抓获。

图丨犯罪嫌疑人陈某勇离开学校视频截图

“昨天还在南明求放过,今天又到花溪排队报名了!”

经调查,黑衣男子名叫陈某勇,为了获取家长“好处费”,自称自己“有关系”“有捷径”,能让孩子读上心仪的学校,因此,16名学生家长“慕名”而来。而为了让新入学的学生能“报名成功”,陈某勇每天持多份假证辗转于不同的学校。

陈某勇曾因伪造使用国家证件被公安机关打击过,出狱后又重操旧业。

那么,这些假证从何而来呢?

民警决定从陈某勇入手,寻线侦查,发现陈某勇经常开车到威清路一巷内老旧小区里。侦查民警立即对小区进行摸排,最后,目标锁定小区顶楼的出租屋。

如何神不知鬼不觉的情况下,打开顶楼出租屋的门呢?

侦查民警分组轮流在该出租屋的入口处设伏,24小时蹲守。三伏天户外气温三十几度,站着不动也汗涔涔的;设伏的地方往往是树下或楼道,蚊虫特别多。面对恶劣天气,侦查员始终努力坚持。

图丨侦查民警在嫌疑人家中查获大量假证

连续蹲守很长时间,顶楼的房门还是紧闭不开。直到8月6日上午,顶楼终于有人出来,民警随即迅速打开顶楼房门、冲进屋子。

民警却被屋子里的场景震撼了!

只见屋内的地板上、沙发上、茶几上,甚至床上,都摆满了大小不一、五颜六色的证书。

有蓝色的毕业证、墨绿的技术职称证、黑色的资质认定证、白色的身份证、深褐的学士学位证、朱红的户口簿。还有许多伪造的印章,涉及全国各地许多单位。为了便于查找,还以省为分类标准,分门别类,用塑料袋装好。

这不只是一个伪造证件窝点了,这完全是一个加工厂。

图丨制造假证工具

民警冲进去时,屋里的两个人还在忙碌“作业”,制作假证。

经审讯,男子陈某和女子李某某系夫妻,从外省赴筑务工,就想到制作假证获取不义之财。为了扩大“销路”,两人还制作“东南亚证件集团公司”及联系电话的名片,到处投递。

但为了规避公安机关打击,两人在屋里购置充足的食物,白天深居简出,不大外出。但再狡猾的狐狸也会露出破绽来。

图丨西湖路派出所民警抓获嫌疑人

该案查获用于制作假证的印刷品1.2万份,印章387个,同时还查获打印机、制证机多台。

目前,陈某勇、陈某、李某某已被公安机关刑事拘留,案件在进一步办理中。

警方提示

不要相信任何的不学自通、不劳而获。如果有,那制假的这对夫妻早就走上他们人生的巅峰了。

不要拿读书的大事,孩子一生的前途和使用假证的这条“捷径”对赌,既毁了孩子心中家长的形象,又损失了钱财,还影响了孩子的学习。“赔了夫人又折兵”,何苦呢?

希望相关部门把好关,一旦发现伪造证件,要及时报警处理。南明公安将重拳出击,砺锋亮剑,惩治犯罪。

转自:贵阳公安南明分局

来源: 贵阳晚报