JavaScript基础知识回顾:

目录:

  1. 比较运算符
  2. 多行字符串,模板字符串
  3. 严格模式
  4. 函数定义和调用
  5. 变量作用域与解构赋值、NameSpace、块级作用域let、const
  6. 方法
  7. 高阶函数
  8. 闭包

我们一个一个慢慢来:

比较运算符:

  • = 如果1=’1’,则为false

  • == 等于 类型不一样,值一样,也会判断为true

  • === 绝对等于,类型一样,值一样,判断为true

  • !== 不等于

  • 这是js的缺陷,尽量不使用==比较

    浮点数问题:

    console.log((1/3)===(1-2/3))

    结果为false,尽管数值是都等于1/3

    尽量避免使用小数计算,因为精度问题

ES6中的模版字符串:

在新行中插入的任何字符都是模板字符串中的一部分,使用普通字符串,你可以通过以下的方式获得多行字符串:

console.log('string text line 1\n' +
'string text line 2');

"string text line 1

string text line 2"

要获得同样效果的多行字符串,只需使用如下代码:

console.log(`string text line 1
string text line 2`);

"string text line 1

string text line 2"

插入表达式:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script> var a=10;
var b = 20;
console.log(`a = ${a},b = ${b}`); </script>
</body>
</html>

通过上述代码可知,需要把表达式${}放入到``中才能正确执行。

详细说明:MDN

严格模式:

严格模式对正常的 JavaScript语义做了一些更改。

  1. 严格模式通过抛出错误来消除了一些原有静默错误(undefined)
  2. 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷:有时候,相同的代码,严格模式可以比非严格模式下运行得更快
  3. 严格模式禁用了在ECMAScript的未来版本中可能会定义的一些语法。
'use strict';
function getAge(){
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name:'小明',
birth:2000,
age:getAge
};
//开不开启use strick 结果不一样
var fn = xiaoming.age;
console.log(fn());

具体链接:MDN

函数定义和调用:

定义函数方式:

定义方式一

绝对值函数

function abs(x){
return x;
}else{
return -x;
}

一旦执行到return代表函数结束,返回结果

定义方法二

var abs = function(x){
return x;
}else{
return -x;
}

function(x){}是一个匿名函数,可以把结果赋值给abs,通过abs就可以调用函数

方法一和方法二等价

调用函数:

abs(10)
abs(-10)

参数问题:javascript可以传任何个参数,也可以不传参数

参数进来是否存在的问题?假设不存在参数,如何抛出异常?

var abs = function(x){
//手动抛出异常来判断
if (typeof x !== 'number') {
throw 'not a number';
}
if (x>=o) {
return x;
}else{
return -x;
}
}

arguments对象:

加入函数的实参没有写多个,但使用时传入了多个参数,使用arguments对象可以把这多个参数用数组返回,argument对象其实就是传入的所有参数的数组。

特性:

1.arguments对象和Function是分不开的。

2.因为arguments这个对象不能显式创建。

3.arguments对象只有函数开始时才可用。

使用方法:

虽然arguments对象并不是一个数组,但是访问单个参数的方式与访问数组元素的方式相同

例如:

arguments[0],arguments[1],。。。arguments[n];

在js中 不需要明确指出参数名,就能访问它们,例如:

function test() {
var s = '';
for (var i = 0; i < arguments.length; i++) {
alert(arguments[i]);
s += arguments[i] + ',';
}
return s;
}
test("name", "age");

结果为name,age

rest参数

例如:函数定义了两个参数,但是传入了第三个参数,要怎么取出第三个参数呢?

function test(a,b){
console.log('a->'+a);
console.log('b->'+b);
//以前的方法取第三个元素:
if (arguments.length>2) {
for(var i = 2; i<arguments.length;i++){
console.log(arguments[i])
}
}
}
//现在的方法(rest参数):在函数中定义rest参数
function test1(a,b,...rest){
console.log('a->'+a);
console.log('b->'+b);
console.log(rest);
}

变量的作用域:

变量的作用域:

function a(){
var x = 1;
//内部函数可以访问外部函数的成员,反之不行
function aa(){
var y = x +1; //2
}
//外部访问了内部函数的变量,会不行
var z = y+1; //报错
}
function foo(a,b){
var x = 1;
function bar(){
var x = 'A';
console.log(x);
}
console.log(x);
bar();
}
foo();

结果: 1 A

全局对象window

'use strict';
window.alert('调用Windows.alert');
var old_alert = window.alert;
window.alert = function(){
alert('无法使用alert方法');
}
window.alert = old_alert;
alert('又可以使用alert方法了');

调用的结果:只执行了两次,第一次输出-->调用Windows.alert;第二次输出-->又可以使用alert方法了

Let关键字:

局部作用域let

ES6let关键字,解决局部作用域冲突问题,现建议大家都用let去定义局部变量

function aaa() {
for(vari=0;i<100;i++){
console.log(i)
}
console.log(i+1); //问题? i 出了这个作用域还可以使用
} //使用let后
function aaa() {
for(leti=0;i<100;i++){
console.log(i)
}
console.log(i+1); //Uncaught ReferenceError: i is not defined
}

const关键字:

在ES6之后,用const定义常量;

const PI = '3.14';
console.log(PI);
PI = '123'; //报错,常量不允许修改

命名空间NameSpace:

防止重名以及命名污染的现象发生;

var MYAPP = {};
var MYAPP2 = {};
MYAPP.name = 'myapp';
MYAPP.version = '1.0';
MYAPP.foo = function(){
console.log("测试");
};
MYAPP.foo();
MYAPP2.name = 'myapp';
MYAPP2.version = '1.0';
MYAPP2.foo = function(){
console.log("测试2");
};
MYAPP2.foo();

方法:

定义方法

方法就是把函数放在对象的里面,对象只有两个东西:属性和方法

var xiaoming = {
name:'小明',
birth:2000,
age:function(){
var y = new Date().getFullYear();
return y -this.birth;
}
};
console.log(xiaoming.age());

成员属性只对子方法负责,不对孙方法负责。

var xiaoming  = {
name:'小明',
birth:2000,
age:function (){
//保存xiaoming这个对象
var that = this;
function getAgeFromBirth(){
var y = new Date().getFullYear();
//如果不保存,这里是找不到birth属性的
return y - that.birth;
}
return getAgeFromBirth();
}
}
console.log(xiaoming.age());

为了解决上面这个缺陷:我们引入了apply关键字;

apply方法是可以控制this指向的,该方法有两个参数,第一个是getArg要使用的是那个对象,第二个是数组;

//解决的js的缺陷
function getAge(){
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name:'小明',
birth:2000,
age :getAge
};
//apply(x,y);
//第一个参数是getAge中this的所需要的指向(不指向为null)
//第二个参数默认是数组格式,表示传入的参数类型
console.log(getAge.apply(xiaoming,[]));

高阶函数使用:

map、reduce、filter

map:实现每个数平方

function pow(x){
return x * x;
}
var arr = [1,2,3,4,5,6,7,8,9];
var result = arr.map(pow);
console.log('='+result);

reduce:实现累加

var arr = [1,2,3,4,5];
//1+2-->3 x
//x+4-->7 x
//x+5-->12 x
var result = arr.reduce(function(x,y){
return x+y;
});
console.log(result);

filter:过滤掉不符合函数要求的值

var arr = [1,2,3,4,5,6,7];
var r = arr.filter(function(x){
return x%2 !== 0;
});
console.log(r);

闭包:

闭包的引入:

//函数内部可以访问全局变量
var n = 999;
function f1(){
console.log(n);
} //外部访问不了函数内部的变量
function f1(){
var n = 999;
}
console.log(n);

使用闭包来实现外部引用内部信息:

function f1(){
var n = 999;
function f2(){
console.log(n);
}
return f2;
}
var res = f1();
res();

复杂闭包的实现:

//闭包复杂代码段
function createIncermentor(start){
return function(){
return start++;
};
}
var inc = createIncermentor(10);
console.log(inc());
console.log(inc());
console.log(inc());

结果:10 11 12

定义类:

function Person(){
var _age;
function setAge(n){
_age = n;
}
function getAge(){
return _age;
}
//{} //var obj = {}是对象
return {
name:name,
getAge:getAge,
setAge:setAge
};
}
var p1 = Person("xbhog");
p1.setAge(88);
console.log(p1.getAge());

结果:88

感觉可以的朋友,可以给我点点关注或者推荐,感谢!

参考引自:

JavaScript | MDN

狂神说JavaScript

JavaScript基础以及进阶知识的更多相关文章

  1. javaScript基础概念小知识点集

    数据类型 typeof是一个操作符而不是函数,因此例子中圆括号尽管可以使用,但不是必须的. 只要在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null NaN是一个特殊的数值,与任何值都 ...

  2. JavaScript 基础学习1-day14

    JavaScript 基础学习1 知识预览JavaScript概述二 JavaScript的基础三 JavaScript的对象BOM对象DOM对象实例练习js扩展 JavaScript概述 JavaS ...

  3. 林大妈的JavaScript基础知识(三):JavaScript编程(2)函数

    JavaScript是一门函数式的面向对象编程语言.了解函数将会是了解对象创建和操作.原型及原型方法.模块化编程等的重要基础.函数包含一组语句,它的主要功能是代码复用.隐藏信息和组合调用.我们编程就是 ...

  4. JavaScript 基础知识 - BOM篇

    前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...

  5. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  6. (转)JAVA AJAX教程第二章-JAVASCRIPT基础知识

    开篇:JAVASCRIPT是AJAX技术中不可或缺的一部分,所以想学好AJAX以及现在流行的AJAX框架,学好JAVASCRIPT是最重要的.这章我给大家整理了一些JAVASCRIPT的基础知识.常用 ...

  7. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  8. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  9. JavaScript——基础知识,开始我们的js编程之旅吧!

    JavaScript基础第01天 1. 编程语言 编程语言: 可以通过类似于人类语言的"语言"来控制计算机,让计算机为我们做事情,这样的语言就叫做编程语言(Programming ...

随机推荐

  1. VMware安装RedHat7、CentOS7后无网卡解决办法

    由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装,默认的网卡类型不兼容找到我们的Vmware虚拟机文件夹,将VMware 虚拟机配置 (.vmx),追加一条设置,网卡类型etherne ...

  2. Mybatis Mapper 映射文件(xxxMapper.xml)

    什么是 Mapper 映射文件 Mapper 映射文件是 Mybatis 用于实现 ORM 映射规则的配置文件,Mybatis 通过映射文件可将数据库查询结构映射为 Java 对象. 创建 Mappe ...

  3. Freemaker生成复杂样式图片并无文件损坏的excel

    Freemaker生成复杂样式图片并无文件损坏的excel 参考Freemarker整合poi导出带有图片的Excel教程,优化代码实现 功能介绍:1.支持Freemarker导出Excel的所有功能 ...

  4. Go语言安装配置

    一.Go语言下载 官方下载地址:https://golang.google.cn/dl/ 选择自己需要的版本下载即可. 二.Go语言安装 下载完成之后,双击go1.16.4.windows-amd64 ...

  5. [论文阅读笔记] Structural Deep Network Embedding

    [论文阅读笔记] Structural Deep Network Embedding 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 现有的表示学习方法大多采用浅层模型,这可能不能 ...

  6. JVM-垃圾收集算法基础

    目录 目录 前言 手动释放内存导致的问题 垃圾判定方法 哪些对象是垃圾? 引用计数算法 可达性分析法 垃圾收集算法 标记-清除 优点 缺点 优化 标记-复制 优点 缺点 优化 标记-整理 优点 缺点 ...

  7. 一探即将到来的 C# 10

    前言 本来因为懒不想写这篇文章,但是不少人表示有兴趣,于是最后决定还是写一下. .NET 6 最近几个预览版一直都在开发体验(如 hot reload.linker 等).平台支持(如 Android ...

  8. Stopper的使用

    工具类,抽象死循环逻辑的 import java.util.concurrent.atomic.AtomicBoolean; /** * if the process closes, a signal ...

  9. Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构)

    Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构) 介绍 对实时视频流的需求给视频服务提供商带来了严峻挑战,必须在管理基础设施和互联网带宽运营成本,还要为客户提供高质量体验.鉴于视频 ...

  10. TVM将深度学习模型编译为WebGL

    使用TVM将深度学习模型编译为WebGL TVM带有全新的OpenGL / WebGL后端! OpenGL / WebGL后端 TVM已经瞄准了涵盖各种平台的大量后端:CPU,GPU,移动设备等.这次 ...