lodash已死?radash库方法介绍及源码解析 —— 判断方法篇
前言
大家好,我是阿瓜。一个励志分享更多技术的前端瓜 ~
我们已经分享了 radash
库中数组、对象等相关的方法,大家感兴趣的可以前往主页查看阅读;
或许你最近在某个地方听过或者看过 radash
这个词,它是一个typescript编写的方法库,如果你想试试使用它,我们有简单使用示例,直接套用类似情景使用即可,如果你想深入了解一下这个库,想阅读一下它的源码,我们也会带你逐行解析代码;不管是哪种,相信你都能在文章里有所收获;
后续所有方法分享完毕后,我们会整理一份详细目录文章以及思维导图,方便大家查阅使用。
isArray:判断某个值是否为数组
使用说明
- 功能说明:跟
Array.isArray()
方法功能一致。 - 参数:需要判断的值。
- 返回值:是数组返回
true
, 否则返回false
。
- 功能说明:跟
使用代码示例
import { isArray } from 'radash' isArray('hello') // => false
isArray(['hello']) // => true
源码解析
相当于直接调用 Array.isArray
export const isArray = Array.isArray
- 方法流程说明:
- 把
Arrary.isArray
重新复制到isArray
,调用时直接写isArray()
- 把
- 方法流程说明:
isDate:判断某个值是否为日期对象
使用说明
- 参数:需要判断的值。
- 返回值:是日期返回
true
, 否则返回false
。
使用代码示例
import { isDate } from 'radash' isDate(new Date()) // => true
isDate(12) // => false
isDate('hello') // => false
源码解析
// 定义一个名为 `isDate` 的函数。
export const isDate = (value: any): value is Date => {
// 使用 `Object.prototype.toString` 方法获取 `value` 的内部 `[[Class]]` 属性。
// 如果 `value` 是一个 `Date` 对象,`[[Class]]` 属性将是 "[object Date]"。
return Object.prototype.toString.call(value) === '[object Date]'
}
方法流程说明:
isDate
函数接受一个任意类型的参数value
。- 函数使用
Object.prototype.toString.call(value)
来获取value
的字符串表示,这是一种检查 JavaScript 值类型的可靠方法。 - 函数比较这个字符串表示是否等于
'[object Date]'
。 - 如果等于,说明
value
是一个Date
对象,函数返回true
。 - 如果不等于,说明
value
不是一个Date
对象,函数返回false
。
isEmpty:判断一个值是否为空
使用说明
- 功能说明:用于检查一个值是否为空。"空" 的定义取决于值的类型,对于不同的数据类型有不同的判断逻辑。
- 参数:需要判断的值。
- 返回值:为空返回
true
,否则返回false
。
使用代码示例
import { isDate } from 'radash' isDate(new Date()) // => true
isDate(12) // => false
isDate('hello') // => false
源码解析
// 定义一个函数 `isEmpty`。
export const isEmpty = (value: any) => {
// 如果值为布尔类型,直接返回 true,因为这里假设布尔类型不携带 "内容"。
if (value === true || value === false) return true // 如果值为 null 或 undefined,返回 true,因为它们代表没有值。
if (value === null || value === undefined) return true // 如果值为数字,返回是否数字为 0。
// 这里假设 `isNumber` 是一个函数,用于检查值是否为数字类型。
if (isNumber(value)) return value === 0 // 如果值为日期对象,检查日期的时间是否为 NaN。
// 这里假设 `isDate` 是一个函数,用于检查值是否为 Date 对象。
if (isDate(value)) return isNaN(value.getTime()) // 如果值是函数,返回 false,因为函数被认为总是 "非空"。
// 这里假设 `isFunction` 是一个函数,用于检查值是否为函数类型。
if (isFunction(value)) return false // 如果值是符号,返回 false,因为符号被认为总是 "非空"。
// 这里假设 `isSymbol` 是一个函数,用于检查值是否为 Symbol 类型。
if (isSymbol(value)) return false // 检查值是否有 length 属性,如果有,检查它是否为 0。
const length = (value as any).length
if (isNumber(length)) return length === 0 // 检查值是否有 size 属性,如果有,检查它是否为 0。
const size = (value as any).size
if (isNumber(size)) return size === 0 // 如果值是对象,通过获取对象的键的数量来判断。
const keys = Object.keys(value).length
return keys === 0
}
方法流程说明:
isEmpty
函数接受一个任意类型的参数value
。- 函数首先检查
value
是否为布尔类型、null
或undefined
,如果是,则返回true
。 - 函数检查
value
是否为数字或日期对象,并对这些类型进行特定的空值检查。 - 函数检查
value
是否为函数或符号,如果是,则返回false
。 - 函数尝试获取
value
的length
和size
属性,并检查它们是否为 0。 - 如果
value
是一个对象,函数检查对象的键的数量是否为 0。 - 返回一个布尔值,表示
value
是否为空。
isEqual:判断两个值是否相等
使用说明
- 功能说明:用于深度比较两个值
x
和y
是否相等。这个函数支持比较原始值、Date
对象、RegExp
对象以及普通对象。 - 参数:需要比较的两个值。
- 返回值:相等返回
true
,否则返回false
。
- 功能说明:用于深度比较两个值
使用代码示例
import { isEqual } from 'radash' isEqual(null, null) // => true
isEqual([], []) // => true isEqual('hello', 'world') // => false
isEqual(22, 'abc') // => false
源码解析
// 定义一个泛型函数 `isEqual`。
export const isEqual = <TType>(x: TType, y: TType): boolean => {
// 首先使用 `Object.is` 检查两个值是否相同,这个方法可以正确处理 `NaN` 和 `-0`。
if (Object.is(x, y)) return true // 如果两个值都是 `Date` 对象,比较它们的时间戳。
if (x instanceof Date && y instanceof Date) {
return x.getTime() === y.getTime()
} // 如果两个值都是 `RegExp` 对象,比较它们的字符串表示。
if (x instanceof RegExp && y instanceof RegExp) {
return x.toString() === y.toString()
} // 如果任何一个值不是对象或者是 `null`,返回 `false`。
if (
typeof x !== 'object' ||
x === null ||
typeof y !== 'object' ||
y === null
) {
return false
} // 使用 `Reflect.ownKeys` 获取 `x` 和 `y` 的所有自有属性键。
const keysX = Reflect.ownKeys(x as unknown as object) as (keyof typeof x)[]
const keysY = Reflect.ownKeys(y as unknown as object) // 如果 `x` 和 `y` 的键的数量不同,返回 `false`。
if (keysX.length !== keysY.length) return false // 遍历 `x` 的键。
for (let i = 0; i < keysX.length; i++) {
// 检查 `y` 是否有相同的键。
if (!Reflect.has(y as unknown as object, keysX[i])) return false // 递归地调用 `isEqual` 来比较 `x` 和 `y` 在当前键上的值。
if (!isEqual(x[keysX[i]], y[keysX[i]])) return false
} // 如果所有检查都通过,返回 `true` 表示 `x` 和 `y` 相等。
return true
}
方法流程说明:
isEqual
函数接受两个类型为TType
的参数x
和y
。- 首先检查两个值是否严格相等,包括处理
NaN
和-0
的情况。 - 如果两个值都是
Date
或RegExp
对象,分别比较它们的时间戳或字符串表示。 - 如果任何一个值不是对象或者是
null
,直接返回false
。 - 获取两个对象的自有属性键,并比较键的数量。
- 遍历
x
的键,并检查y
是否有相同的键。 - 递归地调用
isEqual
函数来比较在每个键上的值。 - 如果所有键和值都匹配,返回
true
表示两个对象相等。
isFloat:判断一个值是否为浮点数
使用说明
- 功能说明:用于检查一个值是否为浮点数。如果是浮点数,它返回
true
;否则返回false
。这个函数依赖于一个未在代码中定义的isNumber
函数,我们可以假设isNumber
函数用于检查一个值是否为number
类型。 - 参数:需要判断的值。
- 返回值:是 float 类型返回
true
,否则返回false
。
- 功能说明:用于检查一个值是否为浮点数。如果是浮点数,它返回
使用代码示例
import { isFloat } from 'radash' isFloat(12.233) // => true
isFloat(12) // => false
isFloat('hello') // => false
源码解析
// 定义一个名为 `isFloat` 的函数。
export const isFloat = (value: any): value is number => {
// 首先使用 `isNumber` 函数检查 `value` 是否为数字类型。
// 然后检查 `value` 除以 1 的余数是否不等于 0,来确定它是否为浮点数。
return isNumber(value) && value % 1 !== 0
}
方法流程说明:
isFloat
函数接受一个任意类型的参数value
。- 函数使用
isNumber
函数检查value
是否为数字类型。 - 函数计算
value
除以 1 的余数,如果余数不等于 0,则说明value
是一个浮点数。 - 如果
value
是一个浮点数,函数返回true
。 - 否则,函数返回
false
。
isFunction:判断一个值是否为函数
使用说明
- 功能说明:用于检查给定的值
value
是否为函数。如果是函数,它返回true
;否则返回false
。 - 参数:需要判断的值。
- 返回值:是函数返回
true
,否则返回false
。
- 功能说明:用于检查给定的值
使用代码示例
import { isFunction } from 'radash' isFunction('hello') // => false
isFunction(['hello']) // => false
isFunction(() => 'hello') // => true
源码解析
// 定义一个名为 `isFunction` 的函数。
export const isFunction = (value: any): value is Function => {
// 检查 `value` 是否存在,并且 `value` 是否具有 `constructor`、`call` 和 `apply` 属性。
// 这些属性是函数对象特有的,所以这个检查用来判断 `value` 是否为函数。
return !!(value && value.constructor && value.call && value.apply)
}
方法流程说明:
isFunction
函数接受一个任意类型的参数value
。- 函数检查
value
是否存在,并且是否具有constructor
、call
和apply
属性。 constructor
属性存在于所有对象上,并指向创建该对象的构造函数。对于函数对象,它通常指向Function
构造函数。call
和apply
方法是函数对象的内置方法,用于调用函数。- 如果所有这些属性都存在,说明
value
是一个函数对象,函数返回true
。 - 如果任何这些属性不存在,说明
value
不是一个函数对象,函数返回false
。
isInt:判断一个值是否是整数
使用说明
- 功能说明:用于检查给定的值
value
是否为整数。如果是整数,它返回true
;否则返回false
。这个函数依赖于一个未在代码中定义的isNumber
函数,我们可以假设isNumber
函数用于检查一个值是否为number
类型。 - 参数:需要判断的值。
- 返回值:是整数返回
true
,否则返回false
。
- 功能说明:用于检查给定的值
使用代码示例
import { isInt } from 'radash' isInt(12) // => true
isInt(12.233) // => false
isInt('hello') // => false
源码解析
// 定义一个名为 `isInt` 的函数。
export const isInt = (value: any): value is number => {
// 首先使用 `isNumber` 函数检查 `value` 是否为数字类型。
// 然后检查 `value` 除以 1 的余数是否等于 0,来确定它是否为整数。
return isNumber(value) && value % 1 === 0
}
方法流程说明:
isInt
函数接受一个任意类型的参数value
。- 函数使用
isNumber
函数检查value
是否为数字类型。 - 函数计算
value
除以 1 的余数,如果余数等于 0,则说明value
是一个整数。 - 如果
value
是一个整数,函数返回true
。 - 否则,函数返回
false
。。
isNumber:判断一个值是否是数字
使用说明
- 功能说明:用于检查给定的值
value
是否为数字类型。如果是数字类型,它返回true
;否则返回false
。这个函数使用了Number
构造函数来尝试将value
转换为数字,然后与原始值进行比较。 - 参数:需要判断的值。
- 返回值:是数字返回
true
,否则返回false
。
- 功能说明:用于检查给定的值
使用代码示例
import { isNumber } from 'radash' isNumber('hello') // => false
isNumber(['hello']) // => false
isNumber(12) // => true
源码解析
// 定义一个名为 `isNumber` 的函数。
export const isNumber = (value: any): value is number => {
try {
// 尝试使用 `Number` 构造函数将 `value` 转换为数字。
// 如果转换后的值与原始值 `value` 相等,返回 `true`。
return Number(value) === value
} catch {
// 如果在尝试转换过程中发生错误,返回 `false`。
return false
}
}
方法流程说明:
isNumber
函数接受一个任意类型的参数value
。- 函数尝试使用
Number
构造函数将value
转换为数字。 - 如果转换后的值与原始值
value
相等(且没有类型转换),则说明value
本身就是一个数字,函数返回true
。 - 如果在尝试转换过程中发生错误(例如,
value
是一个对象或某个无法转换为数字的值),捕获错误并返回false
。
isObject:判断一个值是否为对象
使用说明
- 功能说明:用于检查给定的值
value
是否为普通对象(即直接由Object
构造函数创建的对象)。如果是普通对象,它返回true
;否则返回false
。 - 参数:需要判断的值。
- 返回值:是对象返回
true
,否则返回false
。
- 功能说明:用于检查给定的值
使用代码示例
import { isObject } from 'radash' isObject('hello') // => false
isObject(['hello']) // => false
isObject(null) // => false
isObject({ say: 'hello' }) // => true
源码解析
// 定义一个名为 `isObject` 的函数。
export const isObject = (value: any): value is object => {
// 首先检查 `value` 是否为真值,以排除 `null` 和未定义的值。
// 然后检查 `value.constructor` 是否等于 `Object` 构造函数,
// 这是因为普通对象的构造函数应该是 `Object`。
return !!value && value.constructor === Object
}
方法流程说明:
isObject
函数接受一个任意类型的参数value
。- 函数检查
value
是否为真值,以确保它不是null
或undefined
(这些值会导致value.constructor
访问抛出错误)。 - 函数检查
value
的constructor
属性是否等于全局Object
构造函数。这个检查用来确认value
是否是由Object
构造函数创建的普通对象。 - 如果
value
是一个普通对象,函数返回true
。 - 否则,函数返回
false
。
isPrimitive:判断一个值是否为原始值
使用说明
- 功能说明:用于检查给定的值
value
是否是原始值。原始值是指那些不是对象也不是函数的数据类型,包括undefined
、null
、boolean
、number
、string
和symbol
。如果value
是原始值,函数返回true
;否则返回false
。 - 参数:需要判断的值。
- 返回值:是原始值返回
true
,否则返回false
。
- 功能说明:用于检查给定的值
使用代码示例
import { isPrimitive } from 'radash' isPrimitive(22) // => true
isPrimitive('hello') // => true
isPrimitive(['hello']) // => false
源码解析
// 定义一个名为 `isPrimitive` 的函数。
export const isPrimitive = (value: any): boolean => {
// 检查 `value` 是否为 `undefined` 或 `null`,这两个值是原始值。
// 或者检查 `value` 的类型是否不是 'object' 和 'function',这两个类型表示复合类型。
return (
value === undefined ||
value === null ||
(typeof value !== 'object' && typeof value !== 'function')
)
}
方法流程说明:
isPrimitive
函数接受一个任意类型的参数value
。- 函数检查
value
是否等于undefined
或null
,这两个值是标准的原始值。 - 函数使用
typeof
操作符检查value
是否不是对象('object'
)或函数('function'
)类型。 - 如果
value
是原始值类型之一,函数返回true
。 - 如果
value
是对象或函数类型,函数返回false
。
isPromise:判断一个值是否为Promise
使用说明
- 功能说明:用于检查给定的值
value
是否是一个Promise
对象。如果是Promise
对象,它返回true
;否则返回false
。这个函数在检查时会考虑value
是否存在、是否具有then
属性,以及then
属性是否是一个函数。 - 参数:需要确认的值。
- 返回值:是
Promise
返回true
,否则返回false
。
- 功能说明:用于检查给定的值
使用代码示例
import { isPromise } from 'radash' isPromise('hello') // => false
isPromise(['hello']) // => false
isPromise(new Promise(res => res())) // => true
源码解析
// 定义一个名为 `isPromise` 的函数。
export const isPromise = (value: any): value is Promise<any> => {
// 首先检查 `value` 是否存在,如果不存在(比如是 `null` 或 `undefined`),返回 `false`。
if (!value) return false
// 检查 `value` 是否具有 `then` 属性,如果没有,返回 `false`。
// `then` 属性是 `Promise` 对象特有的。
if (!value.then) return false
// 使用 `isFunction` 函数检查 `value.then` 是否是一个函数,如果不是,返回 `false`。
if (!isFunction(value.then)) return false
// 如果通过了所有检查,返回 `true` 表示 `value` 是一个 `Promise` 对象。
return true
}
方法流程说明:
isPromise
函数接受一个任意类型的参数value
。- 函数检查
value
是否存在,因为null
和undefined
显然不是Promise
对象。 - 函数检查
value
是否具有then
属性,因为所有的Promise
对象都有一个then
方法用于注册回调。 - 函数使用
isFunction
函数检查value.then
是否是一个函数,以确保它符合Promise
的特性。 - 如果
value
满足所有条件,函数返回true
。 - 如果
value
不满足任何一个条件,函数返回false
。
isString:判断一个值是否为字符串
使用说明
- 用于检查给定的值
value
是否为字符串。如果是字符串,它返回true
;否则返回false
。函数检查value
的类型是否为'string'
,这包括了字符串字面量和字符串对象(通过String
构造函数创建的字符串实例)。 - 参数:需要判断的值。
- 返回值:是字符串返回
true
,否则返回false
。
- 用于检查给定的值
使用代码示例
import { isString } from 'radash' isString('hello') // => true
isString(['hello']) // => false
源码解析
// 定义一个名为 `isString` 的函数。
export const isString = (value: any): value is string => {
// 检查 `value` 的类型是否为 'string',这包括了字符串字面量。
// 使用 `instanceof String` 检查 `value` 是否为字符串对象,
// 即通过 `new String(...)` 创建的对象。
return typeof value === 'string' || value instanceof String
}
方法流程说明:
isString
函数接受一个任意类型的参数value
。- 函数使用
typeof
操作符检查value
是否为'string'
类型,这会匹配所有的字符串字面量。 - 函数使用
instanceof String
检查value
是否为String
对象,这会匹配通过new String(...)
创建的字符串实例。 - 如果
value
是字符串字面量或字符串对象,函数返回true
。 - 如果
value
不是字符串字面量或字符串对象,函数返回false
。
isSymbol:判断一个值是否为Symbol
类型
使用说明
- 功能说明:用于检查给定的值
value
是否为symbol
类型。如果是symbol
类型,它返回true
;否则返回false
。 - 参数:需要判断的值。
- 返回值:是
Symbol
类型返回true
,否则返回false
。
- 功能说明:用于检查给定的值
使用代码示例
import { isSymbol } from 'radash' isSymbol('hello') // => false
isSymbol(Symbol('hello')) // => true
源码解析
// 定义一个名为 `isSymbol` 的函数。
export const isSymbol = (value: any): value is symbol => {
// 首先检查 `value` 是否为真值(即不是 `null` 或 `undefined`)。
// 然后检查 `value.constructor` 是否等于全局 `Symbol` 函数,
// 这是因为 `symbol` 类型的值的构造函数应该是 `Symbol`。
return !!value && value.constructor === Symbol
}
方法流程说明:
isSymbol
函数接受一个任意类型的参数value
。- 函数检查
value
是否为真值,以确保它不是null
或undefined
(这些值会导致value.constructor
访问抛出错误)。 - 函数检查
value
的constructor
属性是否等于全局Symbol
函数。这个检查用来确认value
是否是一个由Symbol
函数创建的symbol
类型的值。 - 如果
value
是一个symbol
类型的值,函数返回true
。 - 否则,函数返回
false
。
最后
我相信能看到最后的都是帅气多金又想进步的~~~~人才。
如果你想查看其他 radash
相关方法,前往主页查看
目前radash库得所有方法已经更新完毕,下期阿瓜会整理一份radash
完整方法目录上传,包括思维导图和使用目录。
大家有任何问题或见解,欢迎评论区留言交流和批评指正!!!
你的每一个收藏都是作者写作的动力!!!
lodash已死?radash库方法介绍及源码解析 —— 判断方法篇的更多相关文章
- Android IntentService使用介绍以及源码解析
版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.IntentService概述及使用举例 IntentService内部实现机制用到了HandlerThread,如果对HandlerThrea ...
- IPerf——网络测试工具介绍与源码解析(4)
上篇随笔讲到了TCP模式下的客户端,接下来会讲一下TCP模式普通场景下的服务端,说普通场景则是暂时不考虑双向测试的可能,毕竟了解一项东西还是先从简单的情况下入手会快些. 对于服务端,并不是我们认为的直 ...
- ReentrantLock介绍及源码解析
ReentrantLock介绍及源码解析 一.ReentrantLock介绍 ReentrantLock是JUC包下的一个并发工具类,可以通过他显示的加锁(lock)和释放锁(unlock)来实现线程 ...
- IPerf——网络测试工具介绍与源码解析(2)
对于IPerf源码解析,我是基于2.0.5版本在Windows下执行的情况进行分析的,提倡开始先通过对源码的简单修改使其能够在本地编译器运行起来,这样可以打印输出一些中间信息,对于理解源码的逻辑,程序 ...
- vue系列---Mustache.js模板引擎介绍及源码解析(十)
mustache.js(3.0.0版本) 是一个javascript前端模板引擎.官方文档(https://github.com/janl/mustache.js) 根据官方介绍:Mustache可以 ...
- 【转载】Android IntentService使用全面介绍及源码解析
一 IntentService介绍 IntentService定义的三个基本点:是什么?怎么用?如何work? 官方解释如下: //IntentService定义的三个基本点:是什么?怎么用?如何wo ...
- Java集合 - List介绍及源码解析
(源码版本为 JDK 8) 集合类在java.util包中,类型大体可以分为3种:Set.List.Map. JAVA 集合关系(简图) (图片来源网络) List集合和Set集合都是继承Collec ...
- IPerf——网络测试工具介绍与源码解析(1)
IPerf是一个开源的测试网络宽带并能统计并报告延迟抖动.数据包丢失率信息的控制台命令程序,通过参数选项可以方便地看出,通过设置不同的选项值对网络带宽的影响,对于学习网络编程还是有一定的借鉴意义,至少 ...
- JUC中Lock和ReentrantLock介绍及源码解析
Lock框架是jdk1.5新增的,作用和synchronized的作用一样,所以学习的时候可以和synchronized做对比.在这里先和synchronized做一下简单对比,然后分析下Lock接口 ...
- Android HandlerThread使用介绍以及源码解析
摘要: 版权声明:本文出自汪磊的博客,转载请务必注明出处. 一.HandlerThread的介绍及使用举例 HandlerThread是什么鬼?其本质就是一个线程,但是Han ...
随机推荐
- python实现不同颜色气球隔开摆放,并且提示不能摆放的情况
这个是一位隐秘人物让我做的一道题(如标题),我也分享出来了. 首先是成品展示(暂时没有做成可视化界面的样子): 我做的是把所有的气球录入进来,然后利用基础数据结构(字典,数据等)排序等,由于我是初学, ...
- 深入解析 Dubbo 3.0 服务端暴露全流程
简介: 随着云原生时代的到来,Dubbo 3.0 的一个很重要的目标就是全面拥抱云原生.正因如此,Dubbo 3.0 为了能够更好的适配云原生,将原来的接口级服务发现机制演进为应用级服务发现机制. ...
- [FAQ] CodeLlama GGUF 文件下载
hf-mirror: https://hf-mirror.com/TheBloke/CodeLlama-7B-GGUFmodelscope: https://modelscope.cn/models/ ...
- 学习 Avalonia 框架笔记 如何创建一个全屏置顶的 X11 应用窗口
本文记录我从 Avalonia 框架里面学到如何创建一个全屏置顶的 X11 应用窗口的方法 开始之前,先从 Avalonia 或 CPF 里面拷贝足够的代码,这部分代码可以从本文末尾找到下载方法 设置 ...
- dotnet C# 反射扫描程序集所有类型会不会触发类型静态构造函数
在 dotnet 里面,有很多框架都喜欢扫描程序集进行初始化逻辑,在扫描程序集的所有类型的时候,相当于碰到所有类型.而某个类型的静态构造函数将会在某个类型被使用之前被 CLR 调用,那么扫描类型是否会 ...
- Python requests模块做接口测试
将接口相关信息写入到Excel中,然后用此脚本从Excel中读取相应的信息并组装成URL来发送接口并获取返回的结果,并将结果写入到对应的用例中. import requests import json ...
- 【Oracle】导出全库备份,导入指定的schema并替换现有的表
需求:开发环境,每天晚上做了全库导出备份.由于误操作,现在要恢复指定的schema下的所有表,操作思路如下: 1.全库导出备份的语句 expdp system/oracle full=y dumpfi ...
- 01 Xpath简明教程(十分钟入门)
目录 Xpath简明教程(十分钟入门) Xpath表达式 Xpath节点 节点关系 Xpath基本语法 1) 基本语法使用 2) xpath通配符 3) 多路径匹配 Xpath内建函数 Xpath简明 ...
- MYSQL CONVERT、JSON_EXTRACT函数的使用总结
一.CONVERT.CONCAT.COUNT函数联合查询 CONVERT()函数用于将值从一种数据类型转换为表达式中指定的另一种数据类型. MySQL还允许它将指定的值从一个字符集转换为另一个字符集. ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-46-鼠标滚轮操作
1.简介 有些网站为了节省流量和资源,提高加载效率,采用的是动态加载(懒加载)的,也就是当拖动页面右侧滚动条后会自动加载网页下面的内容,不拖动就不会加载的或者通过鼠标滚轮操作. 2.wheel模拟鼠标 ...