看懂《书源规则:从入门到入土》(7)JS入门-程序接口(终章)

前言:在前面章节中,我们其实接触了一些对象类型和它的一些操作。下面,我们谈谈js里面的对象类型以及不同对象类型的属性和方法。



免责声明:

该系列(看懂《书源规则:从入门到入土》)图文仅供学习使用,自行编写的规则所造成的后果请自行承担,本人概不负责。

------------------------

开篇前,我们先认识一个东西,强制类型转换。

本来其实是不打算说这个东西的,因为js是弱类型语言,会隐式转换。

结果到了这最后一步,我为我的年少无知付出不小的代价 捂脸

之前曾经说过,js的五种数据类型:数字(Number),字符串(String),布尔(Boolean),未定义(Undefined),空(Null)

很明显后两个是一片虚无,是没法把其他的数据类型转换成后两个的 受虐滑稽

所以,就有

Number(),String() ,Boolean()

这三个函数。看名字就知道了,他们的作用就是把其它类型的数据转成指定的类型(数字,字符串,布尔)。

使用方法也很简单,函数名(要转换的数据)就可以返回转换后的数据了。比如:

Number("123") 就会返回数字 123

转换规则:

Boolean():

0 , -0 , null , undefined , NaN , false , ""(空字符串) 返回false,其它都会返回true。

是的,"false"也会返回true 受虐滑稽



Number():

布尔值:true返回1,false返回0。

null:返回0

字符串:

"":返回0

"Infinity":返回Infinity(无穷大)

"-Infinity":返回-Infinity(负无穷大)

-?[0-9]+\.?[0-9]+:转换成对应数字(我这用正则表达式表示字符串的样式大家能看懂吧 受虐滑稽 ,看不懂看回之前的章节)

-?[0-9]+e-?[0-9]+:科学计数法。比如"123e4"表示123*10^4,转换后返回1230000

0x[0-9,a-f,A-F]+:十六进制数字。比如"0x1f"转换后返回31

0o[0-7]+:八进制数字。同理

0b[0-1]+:二进制数字。同理

其它返回NaN



String():

数字:转换成十进制数字输出相应的字符串

其它:看起来像啥就是啥 受虐滑稽



为什么要说这个呢?因为调用的是java api,java/kotlin对类型敏感(而且调用api的时候程序没给我们自动转换 受虐滑稽 )。从网页获取的数据经常也是各种object( 捂脸 这锅得DOM(Document Object Model)去背),不转很容易报错 捂脸

-------------------------

那么这么在规则里加js呢?

在规则最后用@js:(注意有个冒号)或者<js></js>加

比如说:

tag.ul.0@tag.li@js:你的js代码

或者

tag.ul.0@tag.li<js>你的js代码</js>

都是可以的。后一直写法据说在</js>后面还可以接着加其他规则(我没试过,有兴趣的酷友可以去验证一下 受虐滑稽 )

注意别把js加在属性获取(比如说 @textNodes , @href这些 )和净化规则后面了啊 哈哈哈



处理完数据了,那么怎么让阅读得到我们弄好的数据呢?在脚本最后一行吧存放数据的变量直接放出来就可以了,别像我当初一样傻傻的return 捂脸 (当初踩的第一个雷)。比如说:

@js:

var txt1=xxxxx

var txt2=xxxxx

var txt=txt1+txt2

txt

这样就能把txt这个变量的内容返回给阅读

当然:

txt+=xxx



txt=xxxx

这样的写法也可以 吐舌

-----------------------

api文档就不要看放gitee上面那篇入门到入土了(希望是我踩的最后一个雷了 喝酒 ),说得是真的不全。看这个 查看链接 (上述链接被动屏蔽大陆ip)

api(应用程序编程接口)说简单点就是一组预定义的对象,通过调用这些对象能从阅读的程序里获取到一些信息或让阅读做一些事。

首先,这么看懂一个函数希望获取的参数呢?举个例子,下面这个函数的作用是设置阅读接下来要解析的内容(手机版面有限,我给大家拷贝出来哈 无语 )

java.setContent(content: Any?, baseUrl: String? = null)

就像你在js里调用自己封装的函数一样,

函数名(参数1,参数2,参数3,......,参数n)

调用即可。java.setContent就是它的函数名

首先看第一个参数 content: Any? 表示它希望获取的内容是 内容(content) ,可以接受的数据类型是 所有类型(any)。

然后看看第二个参数 baseUrl: String? = null 表示它希望获取的参数是 接下来需要解析的url(baseUrl) ,可以接受的数据类型是 字符串(String) ,如果这个值没指定/传入(即该值为undefined)则默认是 null 。

类型转换的作用就体现在这里了,你不查类型傻乎乎的把一个{"url"}而不是"url"扔进去,boom又踩雷了 受虐滑稽 。报错,日志里一堆鸟语

温馨提示:

1:用 typeof 数据 的方法可以获取数据的基本类型。例:

typeof 123 返回"number",当然typeof 一个变量也是可以的(废话 受虐滑稽 ),获取变量值的类型。

但要注意null的bug

2:如果是引用类型就比较蛋疼了 受虐滑稽

数据 instanceof 对象原型,如果数据是那个类型就返回true,不是就返回false。例:

[1] instanceof Array,返回true

注意:null instanceof Null会报错 ,null instanceof Object会返回false 流汗滑稽

-----------------------

不小心写错了代码结果看日志满屏鸟语是不是看不懂?没事,我们可以在日志里自己写点东西,大致了解下脚本的运行情况。

还记得之前章节里用的console.log()吗?阅读里也有类似的接口java.log(msg),虽然和console.log()还是没法比,但至少能够向日志加一句我们想看到的信息。

用法:java.log(要输出的内容)

比如说想显示此时变量x的值,那么 java.log(x) 这样即可。

-------------------------

其他常用接口

java.getString(ruleStr: String?, mContent: Any? = null, isUrl: Boolean = false)

根据规则提取字符串(💣:这里虽然可接受类型是any,但解析的内容不是字符串会报错 t耐克嘴 。所以,记得转类型)



java.getStringList(ruleStr: String?, mContent: Any? = null, isUrl: Boolean = false)

根据规则提取字符串,并把提取到的所有字符串列成数组,雷区同上



java.getElements(ruleStr: String)

根据规则获取指定元素,返回DOM伪数组(伪数组是一个特殊的Object,它可以像数组一样索引,但一些数组的方法对它用不了)。



java.ajax(urlStr)

网络访问,返回网页源码(伪数组)



其他的java对象的接口自己去文档看吧

-------------------------

变量的话一般用得比较多的是result和baseUrl。

result存放的是之前通过规则获取到的内容,类型是Object(伪数组)。

baseUrl存放的是到这一步时的url,类型是String。



像这种内置对象,老方法,用 对象名.属性名 读取。

chapter和book的属性值还可以在净化规则中用{{对象名.属性名}}访问。

------------------------

结语&真心话

真的不容易,这个系列写了一个多月终于完结了。想当初夸下海口要写一篇入门级的图文,结果...... 汗 不说了 ,内容是有了(但不全),但情节波动比女朋友还平(醒醒,哪来的女朋友 受虐滑稽 )。当初立下的flagsssssssssss 受虐滑稽 哪怕含着泪吐着血也要拔完。

说实话,要形容这章(js入门-程序接口)的撰写过程,真的是一纸荒唐言,两把辛酸泪。仅限能看的api文档,各种意想不到的内部细节,真的是不踩雷不知道 受虐滑稽 。想当初,在看着api文档摸着鱼写源的时候就被炸得遍体鳞伤 喝酒



作为收尾章这章写得有点匆匆了,但调用api又没什么好写的,会看会ctrl+c ctrl+v就行了 受虐滑稽

本期图文到处结束,我们下期再会。🙇‍♂️🙇‍♀️🙇