本篇参考:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions

https://developer.mozilla.org/zh-CN/docs/Glossary/Scope

https://trailhead.salesforce.com/help?article=Salesforce-Certified-JavaScript-Developer-I-Exam-Guide

最近在准备备考salesforce javascript dev1,按照官方的guide的考纲进行学习,发现好多的概念和功能曾经自己是会的,但是概念理解的不深入,好多东西一变形自己就不太清楚了,所以在查看完MDN增强学习以后做一些总结,可以为了以后更好的去理解和学习。

一. 基础数据类型与 typeof

javascript 定义了8种数据类型。

像我们常用的 Array / Set / Map / JSON等等,这些都不是基础的数据类型,都是属于 Object。那么给你一个变量,如何知道它属于哪个类型呢?这个时候可以使用 typeof去做最简单的区分。

typeof用于返回一个未经计算的操作数的类型。根据不同的数据类型会返回不同的结果。下面的表为数据类型以及返回结果之间的关系。

类型 结果
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
BigInt(ECMAScritp2020新增) "bigint"
String "string"
Symbol(ECMAScript2015新增) "symbol"
宿主对象(由js环境提供) 取决于具体实现
Function对象(按照ECMA-262规范实现【Call】) "function"
其他任何对象 "object"

举几个例子进行更好的理解:

// 数值
typeof 37 === 'number';
typeof NaN === 'number'; // 尽管它是 "Not-A-Number" (非数值) 的缩写 // 字符串
typeof ' ' === 'string';
typeof (typeof 1) === 'string'; // typeof 总是返回一个字符串
typeof String(1) === 'string'; // String 将任意值转换为字符串,比 toString 更安全 // 布尔值
typeof true === 'boolean';
typeof Boolean(1) === 'boolean'; // Boolean() 会基于参数是真值还是虚值进行转换
typeof !!(1) === 'boolean'; // 两次调用 ! (逻辑非) 操作符相当于 Boolean() // Symbols
typeof Symbol('foo') === 'symbol'; // Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined'; // Object
// 使用 Array.isArray 或者 Object.prototype.toString.call
// 区分数组和普通对象
typeof [1, 2, 4] === 'object';
typeof null === 'object';
typeof new Date() === 'object'; // 函数
typeof function() {} === 'function';
typeof class C {} === 'function' // 下面的例子令人迷惑,非常危险,没有用处。避免使用它们。因为当使用 new关键字去声明变量时,只有 Function 会返回function,其他都会返回 object。 typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String('abc') === 'object';

二. Falsy 值 情况总结

针对Boolean布尔类型大家肯定都不陌生,布尔类型只有两个值,一个是true,也叫Truthy, 一个是false,也叫 Falsy。我们在用布尔类型时,好多时候都不是直接赋值一个变量是 true / false,而是通过表达式通过上下文强制转换将值转换成布尔值。下面整理一下所有的 Falsy的情况,除了以下的情况,便都是Truthy。

解释
false false关键字
0 数值 0
-0 在数值中分成  +0 、-0,-0也被代表false
On 当 BigInt 作为布尔值使用时, 遵从其作为数值的规则. 0n 是 falsy 值.
"", ", `` 这是一个空字符串 (字符串的长度为零). JavaScript 中的字符串可用双引号 "", 单引号 '', 或 模板字面量 `` 定义。
null null - 缺少值
undefined undefined - 原始值
NaN NaN - 非数值

举一个例子更好的理解:我们看着 []没有值或者 {}没有值以为是 false,其实按照上面的表格,不包含他们,所以只要是不包含,都是 true的情况,执行以后的结果为 execute true

let test = [];
if(test) {
console.log('execute true');
} else {
console.log('execute false');
}

 三 .  Function 与 Scope

函数在我们日常开发中极其常见。我们在函数声明时通常使用两种。函数声明式 以及 函数表达式, 除了这两种情况我们还可以使用 构造函数方式声明一个函数。针对每一样举一个简单例子。

函数表达式:下面声明了一个阶乘函数,用来算 3!的值,我们可以看到前面使用一个变量 = function 形式,function可以有名字,也可以没有名字。比如下面的square函数就没有函数名称。

const factorial = function fac(n) {
return n<2 ? 1 : n*fac(n-1)
}; console.log(factorial(3)); const square = function(number) { return number * number; }; let x = square(4); // x gets the value 16

函数声明式:对上面的square函数进行一下变形,这种函数声明也是我们用的特别多的。

function square(number) {
return number * number;
}

使用构造函数声明

const sum = new Function('a', 'b', 'return a + b');

console.log(sum(2, 6));

说完函数声明以后,接下来就是函数嵌套以及作用域的问题。你可以在一个函数里面嵌套另外一个函数。嵌套(内部)函数对其容器(外部)函数是私有的。它自身也形成了一个闭包。一个闭包是一个可以自己拥有独立的环境与变量的表达式(通常是函数)。

既然嵌套函数是一个闭包,就意味着一个嵌套函数可以”继承“容器函数的参数和变量。换句话说,内部函数包含外部函数的作用域。

可以总结如下:

  • 内部函数只可以在外部函数中访问。
  • 内部函数形成了一个闭包:它可以访问外部函数的参数和变量,但是外部函数却不能使用它的参数和变量。

闭包的详细描述可以查看上面的针对函数的链接。通过嵌套函数了解一下三种函数的作用域区别。

let param = 'test out';
function outer() {
let param = 'test inner';
function functionUsingExpression() {
console.log(param);
} let functionUsingDefine = function() {
console.log(param);
}; let functionWithConstructor = new Function('\tconsole.log(param);'); functionUsingExpression();
functionUsingDefine();
functionWithConstructor();
} outer();

输出结果:

通过结果可以发现当我们使用函数表达式和函数声明式方式情况下,使用当前scope的变量,当我们使用构造函数方式声明的函数时,不继承当前的scope,需要使用全局的变量。

总结:篇中针对考纲做了简单地三个总结。篇中有错误地方欢迎指出,有不懂欢迎留言。

Salesforce Javascript(三) 小结1的更多相关文章

  1. 初识JavaScript(三)

    初识JavaScript(三) 我从上一讲<初识JavaScript(二)>了解到了类型.值.变量的定义以及特点,本节我将学习到JavaScript中的算术运算.二进制浮点数和四舍五入的错 ...

  2. JavaScript 三种绑定事件方式之间的区别

    JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> // ...

  3. 从头开始学JavaScript (三)——数据类型

    原文:从头开始学JavaScript (三)--数据类型 一.分类 基本数据类型:undefined.null.string.Boolean.number 复杂数据类型:object object的属 ...

  4. JavaScript三种绑定事件的方式

    JavaScript三种绑定事件的方式: 1. <div id="btn" onclick="clickone()"></div> // ...

  5. JavaScript 数据类型小结

    数据类型对于机器而言,其意义在于更加合理的分配内存空间,而对于编程者而言,数据类型提供了我们相对应的一系列方法,对数据进行分析与处理. 在本文中,将对JavaScript数据类型的基础知识进行总结,全 ...

  6. Salesforce Javascript(一) Promise 浅谈

    本篇参看: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise https ...

  7. JavaScript 学习小结

    简要的功能点: 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行. 操作 HTML 元素 d ...

  8. JavaScript 三个组成部分

    1.核心(ECMAScript) ECMAScript 仅仅是一个描述,定义了脚本语言的所有属性.方法和对象.其他语言可以实现 ECMAScript 来作为功能的基准,JavaScript 就是这样: ...

  9. (转)轻松学习JavaScript三:JavaScript与HTML的结合

    摘自:http://blog.csdn.net/erlian1992 HTML中的JavaScript脚本必须位于<script>与</script>标签之间,JavaScri ...

  10. javascript 三个 对话框

    用法: 一般写在 </html>之后,<script language="javascript">代码必须放在这里面</script> 三个常用 ...

随机推荐

  1. 浏览器F12,Network中各按钮的作用

    Network下 preserve log:勾选,页面发生跳转,接口不丢失:(比如登录成功跳转到首页,登录的接口就没了,勾选Perserve log,会记录跳转前的接口): Disable cache ...

  2. 随机生成四则运算表达式【Unity】

    根据自己项目需求调整代码中表达式的公共方法 using System.Collections; using System.Collections.Generic; using System; usin ...

  3. 前端常用函数(find、includes、filter、Set、forEach、map、some、every、findIndex、splice、reduce)

    https://blog.csdn.net/qq_24280125/article/details/119275109 array.join(separator) .拼接返回字符串 参数 separa ...

  4. Ubuntu linux下gcc、g++不同版本的安装和切换

    讲解linux下gcc.g++不同版本的安装和切换 Ubuntu 18.04预装GCC版本为7.3,但有时在编译是需要用的不同gcc版本,下面介绍,如何安装不同的gcc 和g++,并设置根据不同的需要 ...

  5. C++ 复习函数的基本知识

    C++ 复习函数的基本知识 要使用 C++ 函数,必须完成如下工作: 1. 提供函数定义: 2. 提供函数原型: 3. 调用函数. 例子: #include <iostream> usin ...

  6. [fiddler的使用]模拟自动回复功能在模拟测试mock第三方对接系统的返回中的使用场景

    [场景描述]在许多对第三方的测试过程中,由于第三方没有测试环境或者测试环境同步开发的时候还未准备好,或者系统间联调时对方还未完成的各种情况下,我们可以通过fiddler来模拟对方的返回. [操作步骤] ...

  7. C语言中的循环

    1我觉得循环就是程序一直重复的执行一些语句,直到当符合条件时停止.循环总体分为while循环,do while循环和for循环. 2while循环和do while循环的区别:while是先判定是否符 ...

  8. jsp第9个作业

    regist.jsp <%@ page language="java" import="java.util.*" pageEncoding="U ...

  9. Python笔记(3)——列表二:操作列表(Python编程:从入门到实践)

    一.遍历列表 1. 遍历整个列表:使用for循环 1 colors=['red','yellow','blue','green'] #定义列表 2 for color in colors: #使用循环 ...

  10. heiamJava16IO流

    Java I/O流 按流的方向分 输入输出流 I表示intput(输入),是数据从硬盘文件读入到内存的过程,称之输入,负责读. O表示output(输出),是内存程序的数据从内存到写出硬盘文件的过程, ...