4个值得收藏的Javascript技巧

目录
  • 前言
  • 1.变量转字符串
  • 2.普通对象
  • 3.once
  • 4.浏览器嗅探
    • 在Chrome中执行
    • 在Node中执行
    • 在Chrome中执行

前言

学习一门语言的一种非常有效的方法就是阅读该编程语言开发的优秀开源项目的源代码。 Vuejs是最好的Javascript开源项目之一。

1.变量转字符串

vue/src/shared/util.js

将值转换为字符串是一个非常常见的需求,在Javascript中,有两个函数将值转换为字符串:

  • String()
  • JSON.stringify()

这两个功能具有不同的机制,请看下面代码:

console.log(String(null)); // null
console.log(JSON.stringify(null)); // null

console.log(String(undefined)); // undefined 这里是字符串
console.log(JSON.stringify(undefined)); // undefined 这里是变量

console.log(String("abc")); // abc
console.log(JSON.stringify("abc")); // "abc"

console.log(String({ key: "value" })); // [object Object]
console.log(JSON.stringify({ key: "value" })); // {"key":"value"}

console.log(String([1, 2, 3])); // 1,2,3
console.log(JSON.stringify([1, 2, 3])); // [1,2,3]

const obj = {
    title: "devpoint",
    toString() {
        return "obj";
    },
};
console.log(String(obj)); // obj
console.log(JSON.stringify(obj)); // {"title":"devpoint"}

从上面输出结果来看,两个方法将对象转为字符串机制存在差异,如何选择呢?

  • 实际开发中我们需要将nullundefined转换为字符串时,经常是希望它返回一个空字符串。
  • 当需要将一个数组和一个普通对象转换为字符串时,经常使用JSON.stringify
  • 如果需要对象的toString方法被重写,则需要使用String()。
  • 在其他情况下,使用String()将变量转换为字符串。

为了满足以上条件,Vue源码的实现如下:

function isPlainObject(obj) {
    return Object.prototype.toString.call(obj) === "[object Object]";
}
function toString(val) {
    if (val === null || val === undefined) return "";
    if (Array.isArray(val)) return JSON.stringify(val);
    if (isPlainObject(val) && val.toString === Object.prototype.toString)
        return JSON.stringify(val);
    return String(val);
}
const obj = {
    title: "devpoint",
    toString() {
        return "obj";
    },
};
console.log(toString(obj)); // obj
console.log(toString([1, 2, 3])); // [1, 2, 3]
console.log(toString(undefined)); // ""
console.log(toString(null)); // ""

2.普通对象

vue/src/shared/util.js

Object.prototype.toString允许将对象转换为字符串。对于普通对象,当调用此方法时,总是返回[object object]

const runToString = (obj) => Object.prototype.toString.call(obj);
console.log(runToString({})); // [object Object]
console.log(runToString({ title: "devpoint" })); // [object Object]
console.log(runToString({ title: "devpoint", author: { name: "devpoint" } })); // [object Object]

类似上面这种对象我们称之为普通对象。

在Javascript中还有一些特殊的对象,如ArrayStringRegExp,它们在Javascript引擎中具有特殊的设计。当它们调用Object.prototype.toString方法时,会返回不同的结果。

const runToString = (obj) => Object.prototype.toString.call(obj);
console.log(runToString(["devpoint", 2021])); // [object Array]
console.log(runToString(new String("devpoint"))); // [object String]
console.log(runToString(/devpoint/)); // [object RegExp]

为了区分特殊设计对象和普通对象,可以用下面的函数来实现。

function isPlainObject(obj) {
    return Object.prototype.toString.call(obj) === "[object Object]";
}

很多时候,我们希望一个函数只执行一次。如果多次调用该函数,则只会执行第一次。

3.once

vue/src/shared/util.js

很多时候,我们希望一个函数只执行一次。如果多次调用该函数,则只会执行第一次。

function once(fn) {
    let called = false;
    return function () {
        if (!called) {
            called = true;
            fn.apply(this, arguments);
        }
    };
}

function launchRocket() {
    console.log("我已经执行了");
}
const launchRocketOnce = once(launchRocket);
launchRocketOnce();
launchRocketOnce();
launchRocketOnce();

4.浏览器嗅探

vue/src/core/util/env.js

我们知道Javascript可以在浏览器、nodejs等环境中运行,那么如何检查当前的Javascript代码是否在浏览器环境中运行?

如果Javascript在浏览器环境中运行,则会有一个全局对象:window。因此,可以通过以下方式判断环境:

const inBrowser = typeof window !== "undefined";

在Chrome中执行

在Node中执行

如果脚本在浏览器环境中运行,那么我们可以通过以下方式获取浏览器的userAgent

const UA = inBrowser && window.navigator.userAgent.toLowerCase();

在Chrome中执行

不同的浏览器具有不同的userAgent。在Internet Explorer的userAgent中,始终包含单词MSIETrident。在Chrome浏览器的userAgent中,始终包含Chrome一词。

同样,在Android操作系统浏览器中,userAgent始终包含单词Android。在iOS中,总是有iPhone、iPad、iPod、iOS一词。

因此,可以通过检查userAgent来确定当前的浏览器供应商和操作系统。

export const UA = inBrowser && window.navigator.userAgent.toLowerCase();
export const isIE = UA && /msie|trident/.test(UA);
export const isIE9 = UA && UA.indexOf("msie 9.0") > 0;
export const isEdge = UA && UA.indexOf("edge/") > 0;
export const isAndroid =  (UA && UA.indexOf("android") > 0) || weexPlatform === "android";
export const isIOS =  (UA && /iphone|ipad|ipod|ios/.test(UA)) || weexPlatform === "ios";
export const isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
export const isPhantomJS = UA && /phantomjs/.test(UA);
export const isFF = UA && UA.match(/firefox\/(\d+)/);

附带说明一下,Edge和Chrome均基于Chromium,因此两种浏览器的userAgent都包含Chrome一词。也就是说,当浏览器的userAgent中包含Chrome一词时,该浏览器不一定是Chrome。const isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge

到此这篇关于4个值得收藏的Javascript技巧的文章就介绍到这了,更多相关Javascript技巧内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 8个JavaScript条件语句优化小技巧分享

    目录 1.Array.includes 2.Array.every 3.尽早 return 4.三元运算符 5.switch...case 6.Map/Object 7.默认函数参数和解构 8.逻辑与运算符 大家好,我是 CUGGZ. 在日常的开发中,我们经常会编写一些条件语句,过多的 ​ ​if...else​ ​会导致代码难以理解和维护,今天来分享几个优化条件语句的小技巧! 1.Array.includes 来看下面的代码: function test(animal) { if (anima

  • JavaScript中二维数组的创建技巧

    Js中二维数组的创建: 首先JavaScript只支持 一维数组 ,但我们可以通过一些方法实现矩阵以及多维数组 其中普通的创建方法并不会出现什么问题: (1) 利用一维数组嵌套一维数组的方式创建二维数组: let arr = [] ; a[0] = [1,2,3,4,5,6]; a[1] = [10,20,30,40,50,60] 然后使用一个 双层for循环 就可以迭代这个二维数组中的元素 所以用这种方法创建多维数组,不管有几个维度,都可以通过嵌套循环来遍历 遇到问题的方法: let arr1

  • JavaScript中Reduce10个常用场景技巧

    目录 累加/累积 求最大/最小值 格式化搜索参数 反序列化搜索参数 拉平嵌套数组 实现 flat 数组去重 数组计数 获取对象多个属性 反转字符串 不知道大家平常用 Reduce 多不多,反正本瓜用的不多.但实际上,Reduce 能做的,比我们能想到的要多得多,本篇带来 10 个Reduce 常用场景和技巧,一定有你不知道~ 冲ヾ(◍°∇°◍)ノ゙ 累加/累积 累加我们可能是最熟悉 Reduce 的一种用法,除此之外,还可以用做累积. // adder const sum = (...nums)

  • 四十九个javascript小知识实用技巧

    目录 一.js整数的操作 二.重写原生alert,记录弹框次数 三.数字交换不声明中间变量的方法 四.万物皆对象 五.If语句的变形 六.使用===,而不是== 七.使用闭包实现私有变量 八.创建对象的构造函数 九.小心使用typeof.instanceof和constructor 十.创建一个自调用函数(Self-calling Funtion) 十一.从数组中获取一个随机项 十二.在特定范围内获取一个随机数 十三.在0和设定的最大值之间生成一个数字数组 十四.生成一个随机的数字字母字符串 十

  • mysql中取出json字段的小技巧

    目录 mysql取出json字段技巧 mysql中使用函数JSON_EXTRACT() spark sql中使用get_json_object() mysql取json,在不知道key情况下,取他的value详细值 mysql取出json字段技巧 有时候会将一些信息以json形式存在数据库中,如果太长的话,在取的过程中sql运行会比较慢,如果只取某些键值的话会比较浪费 mysql中使用函数JSON_EXTRACT() ±-±------------------------------------

  • 20个JS简写技巧提升工作效率

    目录 当同时声明多个变量时,可简写成一行 利用解构,可为多个变量同时赋值 巧用三元运算符简化if else 使用||运算符给变量指定默认值 使用&&运算符简化if语句 使用解构交换两个变量的值 适用箭头函数简化函数 使用字符串模板简化代码 多行字符串也可使用字符串模板简化 对于多值匹配,可将所有值放在数组中,通过数组方法来简写 巧用ES6对象的简洁语法 使用一元运算符简化字符串转数字 使用repeat()方法简化重复一个字符串 使用双星号代替Math.pow() 使用双波浪线运算符(~~)

  • 分离vue文件中css、js代码的简单技巧

    目录 场景 方法 index.vue 基础代码 index.scss 基础代码 index.js 基础代码 拓展 代码 总结 场景 1.因为早期是iOS开发,形成的MVC习惯,个人喜欢css.js代码独立放一个文件里面,也就是分离样式模块和业务处理模块 2.写复杂界面.复杂业务的时候,界面.样式.业务代码都放.vue文件里面,代码量很大,几千上万行的,难受,割了吧(简单页面可忽略) 3.基于vue2 cli3项目 方法 挺简单的,就是利用下ES6的import和export 例如mockData

  • JS创建或填充任意长度数组的小技巧汇总

    目录 前言 直接填充法 for 循环 push() 法 Array 构造函数法 在 Array 构造函数后面加上 fill() 方法 使用 undefined 填充数组 使用 Array.from() 进行映射 用值填充数组 使用唯一(非共享的)对象创建数组 用升序整数数列创建数组 用任意范围的整数进行创建 另一种创建升序整数数组的方法使用 keys() 总结 前言 在 JavaScript 开发中,经常需要有需要创建特性长度数组的场景,本文总结了几种创建或填充任意长度的数组的小技巧,学会了可以

  • 交互式可视化js库gojs使用介绍及技巧

    目录 1. gojs 简介 2. gojs 应用场景 3. 为什么选用 gojs: 4. gojs 上手指南 5. 小技巧(非常实用哦) 6. 实践:实现节点分组关系可视化交互图 最后 1. gojs 简介 gojs 是一个用于构建交互式可视化图的 js 库,使用可自定义的模板和布局构建复杂节点.链接和组,从而构建出简单到复杂的各类图,如流程图.脑图.组织图.甘特图等.而且提供了许多用于用户交互的高级功能,例如拖放.复制和粘贴.就地文本编辑...... gojs 是 Northwoods Sof

  • 4个值得收藏的Javascript技巧

    目录 前言 1.变量转字符串 2.普通对象 3.once 4.浏览器嗅探 在Chrome中执行 在Node中执行 在Chrome中执行 前言 学习一门语言的一种非常有效的方法就是阅读该编程语言开发的优秀开源项目的源代码. Vuejs是最好的Javascript开源项目之一. 1.变量转字符串 vue/src/shared/util.js 将值转换为字符串是一个非常常见的需求,在Javascript中,有两个函数将值转换为字符串: String() JSON.stringify() 这两个功能具有

  • 21个值得收藏的Javascript技巧

    1  Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscript的字符型(或者数值型)数组,现在需要转换为以逗号分割的CSV格式文件.则我们可以使用如下的小技巧,代码如下: 复制代码 代码如下: var fruits = ['apple', 'peaches', 'oranges', 'mangoes'];var str = fruits.valueOf(); 输出:apple,peaches,oranges,mangoes 其中,valueOf()方法会将Jav

  • 15个值得收藏的JavaScript函数

    目录 1.逆转数字 2.获取数组中最大的n个数字 3.计算阶乘 4.判断当前运行环境是否为浏览器 5.判断当前运行环境是否为Node.js 6.获取url上的参数 7.rgb(x,x,x)颜色表达方式格式转换成对象格式 8.转义字符串以在 HTML 中使用 9.Unescapes 转义 HTML 字符 10.生成指定范围内的随机整数 11.将波浪号路径转换为绝对路径 12.获取不带任何参数或片段标识符的当前 URL 13.以字节为单位返回字符串的长度 14.随机获取数组中元素 15.检查字符串是

  • Vue.js九个性能优化技巧(值得收藏)

    目录 Functional components Child component splitting Local variables Reuse DOM with v-show KeepAlive Deferred features Time slicing Non-reactive data Virtual scrolling 总结 参考资料 这篇文章主要参考了 Vue.js 核心成员Guillaume Chau在 19 年美国的 Vue conf 分享的主题:9 Performance se

  • 41个Web开发者必须收藏的JavaScript实用技巧

    Web开发者必须收藏的JavaScript实用技巧,供大家参考,具体内容如下 1. 将彻底屏蔽鼠标右键 oncontextmenu="window.event.returnValue=false" < table border oncontextmenu=return(false)>< td>no< /table> 可用于 Table 2. 取消选取.防止复制 < body onselectstart="return false&qu

  • 值得收藏的SpringBoot 实用的小技巧

    前言 最近分享的一些源码.框架设计的东西.我发现大家热情不是特别高,想想大多数应该还是正儿八经写代码的居多:这次就分享一点接地气的: SpringBoot 使用中的一些小技巧. 算不上多高大上的东西,但都还挺有用. 屏蔽外部依赖 第一个是屏蔽外部依赖,什么意思呢? 比如大家日常开发时候有没有这样的烦恼: 项目是基于 SpringCloud 或者是 dubbo 这样的分布式服务,你需要依赖许多基础服务. 比如说某个订单号的生成.获取用户信息等. 由于服务拆分,这些功能都是在其他应用中以接口的形式提

  • 值得收藏的9个提高代码运行效率的小技巧(推荐)

    我们写程序的目的就是使它在任何情况下都可以稳定工作.一个运行的很快但是结果错误的程序并没有任何用处.在程序开发和优化的过程中,我们必须考虑代码使用的方式,以及影响它的关键因素.通常,我们必须在程序的简洁性与它的运行速度之间做出权衡.今天我们就来聊一聊如何优化程序的性能. 1. 减小程序计算量 1.1 示例代码 for (i = 0; i < n; i++) { int ni = n*i; for (j = 0; j < n; j++) a[ni + j] = b[j]; } 1.2 分析代码

  • 值得收藏的asp.net基础学习笔记

    值得收藏的asp.net基础学习笔记,分享给大家. 1.概论 浏览器-服务器 B/S 浏览的 浏览器和服务器之间的交互,形成上网B/S模式 对于HTML传到服务器  交给服务器软件(IIS)  服务器软件直接读取静态页面代码,然后返回浏览器 对于ASPX传达服务器  交给服务器软件(IIS)   IIS发现自己处理不了aspx的文件,就去映射表根据后缀名里找到响应的处理程序(isapi,服务器扩展程序) 问题:IIS如何调用可扩展程序? 答:可扩展程序首先就是按照IIS提供的借口实现代码,所以I

  • Shell脚本编写的八条可靠建议(值得收藏)

    这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训.事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条.毫不夸张地说,每条都是精挑细选的,虽然有几点算是老生常谈了. 1. 指定bash shell 脚本的第一行,#!之后应该是什么?如果拿这个问题去问别人,不同的人的回答可能各不相同. 我见过/usr/bin/env bash,也见过/bin/bash,还有/usr/bin/bash,还有/bin/sh,还有/usr/bin/env sh.这算是编程界的

  • 12个非常有用的JavaScript技巧

    在这篇文章中,我将分享12个非常有用的JavaScript技巧.这些技巧可以帮助你减少并优化代码. 1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true.对于做这样的检查,你可以使用||(双重否定运算符),它能自动将任何类型的数据转换为布尔值,只有这些变量才会返回false:0,null,"",undefined或NaN,其他的都返回true.我们来看看这个简单的例子: function Account(cash) {

随机推荐